MVP模式下的RecyclerView案例

本文介绍如何在Android应用中将SprigView与RecyclerView相结合,实现流畅的上下拉刷新和加载更多功能。包括依赖导入、布局配置、自定义适配器及ViewHolder,以及采用MVP模式进行数据获取和展示。

一,镶嵌在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.Adapter
public 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(设置权限和配置)

  

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


       

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值