使用到的依赖和jar包
RecyclerView依赖
compile 'com.android.support:recyclerview-v7:26.0.0+'
SpringView依赖
compile 'com.liaoinstan.springview:library:1.2.6'
OkHttp3的依赖
compile 'com.squareup.okhttp3:okhttp:3.2.0'
compile 'com.squareup.okio:okio:1.7.0'
OkHttp Log拦截
compile 'com.squareup.okhttp3:logging-interceptor:3.2.0'
还有下载的json和imageloard的jar包
首先创建MVP框架
1.model层
public class MainActivityModel { //提供对应的上拉下拉方法 //up为true就是下拉刷新,为false就是上拉加载 public void onfresh(boolean up, final ModelCallBack modelCallBack) { //拿封装好的网络请求数据,第一个参数map类型,不需要,第二个,请求路劲,第三个回调,泛型是你的bean指定类型 OkhttpUtils.getInstance().asy(null, "http://120.27.23.105/product/getProducts?pscid=39&page=1", new AbstractUiCallBack<MyBean>() { @Override public void success(MyBean myBean) { //成功就调到数据了,然后要回调到presenter里 modelCallBack.success(myBean); } @Override public void failure(Exception e) { modelCallBack.failure(e); } }); } //创建回调接口 public interface ModelCallBack { public void success(MyBean myBean); public void failure(Exception e); } }
2.view层
public interface MainActivityView { //数据成功回调的方法,需要数据参数 public void success(MyBean myBean); //失败,封装的接口(okhttp)里回调一个Exception public void fasle(Exception e); }
3.p层
public class MainActivityPresenter { //实例model MainActivityModel mainActivityModel; //实例view MainActivityView mainActivityView; //构造方法 public MainActivityPresenter(MainActivityView mainActivityView) { //view接口传过来他就持有MainActivityView,然后定义出来,构造 this.mainActivityView = mainActivityView; this.mainActivityModel = new MainActivityModel(); } //获取数据的方法,上拉刷新和下拉加载 public void onfresh(boolean up) { mainActivityModel.onfresh(up, new MainActivityModel.ModelCallBack() { @Override public void success(MyBean myBean) { //通过view的接口往回调 mainActivityView.success(myBean); } @Override public void failure(Exception e) { mainActivityView.fasle(e); } }); } }
二,适配器
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> { //上下文和数据 Context context; List<MyBean.DataBean> lists; //构造方法 public RecyclerViewAdapter(Context context) { this.context = context; } //添加数据 public void addbean(List<MyBean.DataBean> list) { if (lists==null){ lists = new ArrayList<>(); } lists.addAll(list); //更新数据 notifyDataSetChanged(); } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.item_layout, parent, false); //返回对应的布局 return new ViewHolder(view); } @Override public void onBindViewHolder(ViewHolder holder, int position) { //直接拿到 ViewHolder viewHolder = (ViewHolder) holder; //做显示,拆分图片 String[] split = lists.get(position).getImages().split("\\|"); ImageLoader.getInstance().displayImage(split[0],holder.imageview); viewHolder.text1.setText(lists.get(position).getTitle()); viewHolder.text2.setText(lists.get(position).getPrice()+"元"); } @Override public int getItemCount() { return lists==null?0:lists.size(); } public class ViewHolder extends RecyclerView.ViewHolder { private final ImageView imageview; private final TextView text1; private final TextView text2; public ViewHolder(View itemView) { super(itemView); //找到控件 imageview = itemView.findViewById(R.id.imageview); text1 = itemView.findViewById(R.id.text1); text2 = itemView.findViewById(R.id.text2); } } }
三,主布局和子布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <com.liaoinstan.springview.widget.SpringView android:id="@+id/springview" android:layout_width="wrap_content" android:layout_height="wrap_content"> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerview" android:layout_width="wrap_content" android:layout_height="wrap_content"> </android.support.v7.widget.RecyclerView> </com.liaoinstan.springview.widget.SpringView> </LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:background="#fff" android:gravity="center_horizontal" android:layout_width="match_parent" android:layout_height="wrap_content"> <ImageView android:id="@+id/imageview" android:layout_width="100dp" android:layout_height="100dp" android:src="@mipmap/ic_launcher"/> <LinearLayout android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content" > <TextView android:text="XXXXXXXX" android:id="@+id/text1" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:text="XXXXXXXX" android:id="@+id/text2" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> </LinearLayout>
四,Imageloard配置
public class MyApps extends Application { @Override public void onCreate() { super.onCreate(); ImageLoaderConfiguration imageLoaderConfiguration = new ImageLoaderConfiguration .Builder(this) .build(); ImageLoader.getInstance().init(imageLoaderConfiguration); //然后要到清单文件中配置name和网络权限 } }
五,bean类拿给的接口去请求去创建
六,导入ok封装包和拦截器
七,anctivity
public class MainActivity extends AppCompatActivity implements MainActivityView { //初始化控件 RecyclerView recyclerview; SpringView springview; private MainActivityPresenter mainActivityPresenter; private RecyclerViewAdapter recyclerViewAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //找到控件 recyclerview = findViewById(R.id.recyclerview); springview = findViewById(R.id.springview); //获取数据,使用mvp模式,创建p层,实例化,presenter回调需要把当前的view接口传过去 mainActivityPresenter = new MainActivityPresenter(this); //MainActivityPresenter回调view,需要定义一个view的接口 //实例化适配器 recyclerViewAdapter = new RecyclerViewAdapter(this); //布局管理器,一参上下文,二参方向 LinearLayoutManager layoutManager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false); //给RecyclerView设置管理器 recyclerview.setLayoutManager(layoutManager); //设置适配器 recyclerview.setAdapter(recyclerViewAdapter); //springview添加头尾部 springview.setHeader(new DefaultHeader(this)); springview.setFooter(new DefaultFooter(this)); //特别要注意springview的监听 springview.setListener(new SpringView.OnFreshListener() { @Override public void onRefresh() { //实例化presenter调用precenter里的方法,precenter掉model mainActivityPresenter.onfresh(true); } @Override public void onLoadmore() { mainActivityPresenter.onfresh(false); } }); //给一个默认显示 mainActivityPresenter.onfresh(true); } @Override public void success(MyBean myBean) { //最后要显示数据,更新数据源 if(springview != null){ springview.onFinishFreshAndLoad(); } recyclerViewAdapter.addbean(myBean.getData()); } @Override public void fasle(Exception e) { Toast.makeText(MainActivity.this, "error", Toast.LENGTH_SHORT).show(); } }