RecyclerView搭配SwipeRefreshLayout和BaseQuickAdapter万能适配器实现下拉刷新和上拉加载更多

第一步导入jar包

在app目录下的build.gradle文件中添加

    implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.22'
    implementation 'com.android.support:recyclerview-v7:27.1.1'

再到工程目录下的build.gradle文件中添加

buildscript {
    repositories {
        jcenter()
        mavenCentral()
        google()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.2'
        classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'

    }
}


allprojects {
    repositories {
        jcenter()
        maven { url "https://jitpack.io" }
        google()
    }
}
task clean(type: Delete) {
    delete rootProject.buildDir
}

这样在项目中就能使用Recyclerview和万能适配器BaseQuickAdapter了

第二步 当然是新建布局加入Recyclerview了,这里我加入了Google官方的下拉刷新控件SwipeRefreshLayout

    
        
        
    

初始化控件设置各种属性


    /**
     * 初始化View控件
     */
    private void initView() {
        refreshLayout=findViewById(R.id.swipe_refresh);
        recyclerView=findViewById(R.id.recycler_view);
        LinearLayoutManager layoutManager=new LinearLayoutManager(MainActivity.this);//创建为listview形式的recyclerview
        recyclerView.setLayoutManager(layoutManager);//这一步必不可少,少了就什么都看不见了
        refreshLayout.setColorSchemeResources(R.color.colorAccent);//这个方法是设置SwipeRefreshLayout刷新圈颜色
    }
}

初始化数据源设置你需要的万能适配器

适配器的创建新建类 继承与 BaseQuickAdapter这里面第一个参数为你的当前数据源类型,第二个参数是底下的内部类继承与BaseViewHodler;


public class MainActivityAdapter extends BaseQuickAdapter {

    /**
     *
     * @param layoutResId  recyclerview的item布局
     * @param data  数据源的类型
     */
    public MainActivityAdapter(int layoutResId, @Nullable List data) {
        super(layoutResId, data);
    }

    /**
     *  这个方法有点类似于原始适配器的onBindViewHolder方法
     * @param helper
     * @param item
     */
    @Override
    protected void convert(MyViewHodler helper, MainEntity item) {
        //如果你想实现某一个控件的点击事件可以在这里添加监听,然后在activity中实现方法就可以了
        helper.setText(R.id.text_content,item.getNaem()).addOnClickListener(R.id.text_content);

    }

    class MyViewHodler extends BaseViewHolder{
        private TextView text_content;
        public MyViewHodler(View view) {
            super(view);
            text_content=view.findViewById(R.id.text_content);
        }
    }
}

 

  /**
     * 初始化数据源设置各种属性
     */
    private void initData() {
        adapterListDate=new ArrayList<>();
        adapter=new MainActivityAdapter(R.layout.activity_main_item,adapterListDate);
        recyclerView.setAdapter(adapter);
}

添加列表所需要的功能,比如添加头部和设置数据显示动画,添加整个item的点击事件和某个控件的点击事件

      View view= LayoutInflater.from(MainActivity.this)
                 .inflate(R.layout.headview_layout,null);
      adapter.addHeaderView(view);//这是设置头部的方法,一个方法搞定,不需要跟以前一样去适配器里面判断一大堆,很方便
//    adapter.addFooterView();有头当然有尾也是一个方法搞定


      //开启动画(默认为渐显效果)
      adapter.openLoadAnimation();
    
//这个方法有下面五个显示动画
//    adapter.openLoadAnimation(BaseQuickAdapter.ALPHAIN);

//    public static final int ALPHAIN = 0x00000001;

//    public static final int SCALEIN = 0x00000002;

//    public static final int SLIDEIN_BOTTOM = 0x00000003;

//    public static final int SLIDEIN_LEFT = 0x00000004;

//    public static final int SLIDEIN_RIGHT = 0x00000005; 

      //自动触发下拉刷新
      recyclerView.postDelayed(new Runnable() {
            @Override
            public void run() {
                //这个方法是让一进入页面的时候实现网络请求,有个缓冲的效果
                refreshLayout.setRefreshing(true);
                //模拟一下网络请求
                page=1;//page为页数 
                loadDate(page);
            }
        }, 2000);
        //手动刷新 触发SwipeRefreshLayout的下拉刷新方法
        refreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                isLoadMore = false;
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        //模拟一下网络请求
                        page=1;
                        loadDate(page);
                    }
                }, 2000);
            }
        });
        adapter.setOnLoadMoreListener(new BaseQuickAdapter.RequestLoadMoreListener() {
            @Override
            public void onLoadMoreRequested() {
                //这个是适配器自带的上拉加载功能 很方便一个实现方法搞定
                isLoadMore = true;
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        //模拟一下网络请求
                        page++;
                        loadDate(page);
                    }
                }, 2000);
            }
        }, recyclerView);

        adapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
                //这个是整个item的点击事件,我们可以在这里做一些操作
                Toast.makeText(MainActivity.this,"我是第"+page+"页的第" + position + "位置",Toast.LENGTH_SHORT).show();
            }
        });
        adapter.setOnItemChildClickListener(new BaseQuickAdapter.OnItemChildClickListener() {
            @Override
            public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {
                //看清楚这个是某一个控件的点击方法,不要搞混
                 Toast.makeText(MainActivity.this,"我是控件第"+page+"页的第" + position + "位置",Toast.LENGTH_SHORT).show();
            }
        });

然后模拟一下网络请求加载数据

 /**
     * 添加数据源数据  相当于网络请求
     */
    private void loadDate(int page) {
        if (refreshLayout.isRefreshing()) {
            refreshLayout.setRefreshing(false);
        }
        List date=new ArrayList<>();
        //isLoadMore是用来区分下拉刷新和上拉加载的数据添加
        if (isLoadMore) {
            for (int i = 0; i <= 15; i++) {
                date.add("我是第"+page+"页的第" + i + "行");
            }
            adapterListDate.addAll(date);
            adapter.notifyDataSetChanged();
            //这个方法必须的写上  它有好几种情况,可以根据需求自己定义
            adapter.loadMoreComplete();//结束这次加载,不写的话上拉加载就会一直在那转圈
        }else{
            adapterListDate.clear();
            for (int i = 0; i <= 15; i++) {
                date.add("我是第"+page+"页的第" + i + "行");
            }
            adapterListDate.addAll(date);
            adapter.notifyDataSetChanged();
            adapter.loadMoreComplete();
        }
    }

好了 这样一个有头、有尾、有下拉刷新、有上拉加载更多的recyclerview就完成了,很简单吧!功能有很多,有时间再探索吧!

标题

送上Demo

https://download.csdn.net/download/chengxuyuanchaochao/10545453

 

你可能感兴趣的:(android)