MVP模式下的RecyclerView案例

来源:互联网 发布:优化算法比较好的书籍 编辑:程序博客网 时间:2024/05/19 14:16

一,镶嵌在SprigView中,要导入SprigView和RecyclerView的依赖(百度)


二,布局

      

<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>
三,创建适配器

//继承RecyclerView.Adapterpublic class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {    //上下文和数据    Context context;    List<MyBean.ResultBean.DataBean> list;    //构造方法    public RecyclerViewAdapter(Context context) {        this.context = context;          }    //添加数据    public void addbean(List<MyBean.ResultBean.DataBean> list) {        list.addAll(list);        //更新数据        notifyDataSetChanged();    }    //重写三个方法    @Override    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        //根据类型viewType创建ViewHolder,多条目有几个创建几个        if (viewType == 0) {            View view1 = LayoutInflater.from(context).inflate(R.layout.itemre, parent, false);            //返回对应的布局            return new ViewHolder(view1);        } else if (viewType == 1) {            View view2 = LayoutInflater.from(context).inflate(R.layout.itemre2, parent, false);            return new ViewHolder2(view2);        } else {            View view3 = LayoutInflater.from(context).inflate(R.layout.itemre3, parent, false);            return new ViewHolder3(view3);        }    }    @Override    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {        //根据ViewHolder判断多条目显示        if (holder instanceof ViewHolder) {            //直接拿到            ViewHolder viewHolder = (ViewHolder) holder;            //做显示            viewHolder.itemTextview.setText(list.get(position).getTitle());            ImageLoader.getInstance().displayImage(list.get(position).getThumbnail_pic_s(),viewHolder.itemImageView);        } else if (holder instanceof ViewHolder2) {            ViewHolder2 viewHolder2 = (ViewHolder2) holder;            viewHolder2.item2Textview.setText(list.get(position).getTitle());            ImageLoader.getInstance().displayImage(list.get(position).getThumbnail_pic_s(),viewHolder2.item2ImageView1);            ImageLoader.getInstance().displayImage(list.get(position).getThumbnail_pic_s02(),viewHolder2.item2ImageView2);        } else {            ViewHolder3 viewHolder3 = (ViewHolder3) holder;            viewHolder3.item3Textview.setText(list.get(position).getTitle());            ImageLoader.getInstance().displayImage(list.get(position).getThumbnail_pic_s(),viewHolder3.item3ImageView1);            ImageLoader.getInstance().displayImage(list.get(position).getThumbnail_pic_s02(),viewHolder3.item3ImageView2);            ImageLoader.getInstance().displayImage(list.get(position).getThumbnail_pic_s03(),viewHolder3.item3ImageView3);        }    }    @Override    public int getItemCount() {        return list.size();    }    //还需要重写方法    // 对应布局类型    @Override    public int getItemViewType(int position) {        if (!TextUtils.isEmpty(list.get(position).getThumbnail_pic_s03())){            return 2;        }else if (!TextUtils.isEmpty(list.get(position).getThumbnail_pic_s02())){            return 1;        }else{            return 0;        }    }    //使用buttonknife自动创建viewHolder,继承RecyclerViewHolder    static class ViewHolder extends RecyclerView.ViewHolder {        @BindView(R.id.item_image_view)        ImageView itemImageView;        @BindView(R.id.item_textview)        TextView itemTextview;        ViewHolder(View view) {            //给一个super            super(view);            ButterKnife.bind(this, view);        }    }    static class ViewHolder2 extends RecyclerView.ViewHolder {        @BindView(R.id.item2_image_view1)        ImageView item2ImageView1;        @BindView(R.id.item2_image_view2)        ImageView item2ImageView2;        @BindView(R.id.item2_textview)        TextView item2Textview;        ViewHolder2(View view) {            super(view);            ButterKnife.bind(this, view);        }    }    static class ViewHolder3 extends RecyclerView.ViewHolder {        @BindView(R.id.item3_image_view1)        ImageView item3ImageView1;        @BindView(R.id.item3_image_view2)        ImageView item3ImageView2;        @BindView(R.id.item3_image_view3)        ImageView item3ImageView3;        @BindView(R.id.item3_textview)        TextView item3Textview;        ViewHolder3(View view) {            super(view);            ButterKnife.bind(this, view);        }    }}
四,适配器中用到的子布局很简单,在此不做介绍了

五,拿到接口,封装数据bean

六,获取数据

       1,创建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);            }        });    }    //上拉加载需要一个page参数    /*public void onloadmore(int page){    }*/
         2,创建model层

public class MainActivityModel {    //提供对应的上拉下拉方法    //up为true就是下拉刷新,为false就是上拉加载    public void onfresh(boolean up, final ModelCallBack modelCallBack){        //拿封装好的网络请求数据,第一个参数map类型,不需要,第二个,请求路劲,第三个回调,泛型是你的bean指定类型        OkhttpUtils.getInstance().asy(null, "http://v.juhe.cn/toutiao/index?type=top&key=597b4f9dcb50e051fd725a9ec54d6653", 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);    }    //需要判断是上拉还是下拉,就需要写两个方法,给个boon值用来判断,up为true是    /*public void onloadmore(int page){    }*/}

             3,view层

public interface MainActivityView {    //数据成功回调的方法,需要数据参数    public void success(MyBean myBean);    //失败,封装的接口(okhttp)里回调一个Exception    public void fasle(Exception e);}
七,Activity

//实现View接口public class MainActivity extends Activity 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.getResult().getData());    }    @Override    public void fasle(Exception e) {        Toast.makeText(MainActivity.this, "error", Toast.LENGTH_SHORT).show();    }}

八,请求数据用到的封装好的OKHTTP

九,多条目布局用Imageloader(设置权限和配置)

  

//配置Imageloaderpublic class MyApps extends Application{    @Override    public void onCreate() {        super.onCreate();        ImageLoaderConfiguration imageLoaderConfiguration = new ImageLoaderConfiguration                .Builder(this)                .build();        ImageLoader.getInstance().init(imageLoaderConfiguration);        //然后要到清单文件中配置name和网络权限    }}