Android RecyclerView (十)组件化封装

pullrefreshrecyclerylib 开发文档



GitHub项目地址 点击查看详情


  • 下拉刷新
  • 上拉加载更多
  • 多布局模式适配
  • 加载中状态
  • 加载无数据状态

1 工程添加依赖

使用前先去GitHub下载依赖库下载

然后再向工程中添加依赖

compile project(':pullrefreshrecyclerylib')
2 初始化基本使用

效果样式 一 无上拉加载更多 也无下拉刷新功能



效果样式 二 有上拉加载更多 有下拉刷新功能



效果样式 三 无上拉加载更多 有下拉刷新功能



效果样式 四 有上拉加载更多 无下拉刷新功能

2.1 创建RecyclerView并设置数据

        //初始化
        pullRecyclerViewUtils = PullRecyclerViewUtils.getInstance();

        //1条目布局ID
        int itemLayoutId = R.layout.item_comm_base_layout;
        //2数据集合
        final List<DataModel> list = new ArrayList<>();

        //3初始化Recyclerview
        /**
         * 参数一 this Context实例
         * 参数二 单一布局模式条目布局ID
         * 参数三 数据集合
         * 参数四 回调监听
         */
        RelativeLayout relativeLayout = pullRecyclerViewUtils.setRecyclerViewFunction(this, itemLayoutId, list, mPullRecclerLinserner);

        //4相关设置
        //----
        //设置RecyclerView的模式
        /**
         *
         * @param statue NORMAL,//正常状态下,没有下拉刷新也没有上拉加载更多
         *               PULL_REFRESH,//只有下拉刷新功能
         *               UP_LOAD_MORE,//只有上拉加载更多功能
         *               PULL_AND_UP//下拉刷新 上拉加载功能
         * @see PullRecyclerViewUtils.RECYCLRYVIEW_STATUE
         */
        switch (pageType) {
            case 1:
                //下拉刷新和上拉加载更多模式
                pullRecyclerViewUtils.setRecyclerviewStatue(PullRecyclerViewUtils.RECYCLRYVIEW_STATUE.PULL_AND_UP);
                break;

            case 2:
                //无下拉刷新 也无上拉加载更多
                pullRecyclerViewUtils.setRecyclerviewStatue(PullRecyclerViewUtils.RECYCLRYVIEW_STATUE.NORMAL);
                break;
            case 3:
                //无下拉刷新 只有上拉加载更多
                pullRecyclerViewUtils.setRecyclerviewStatue(PullRecyclerViewUtils.RECYCLRYVIEW_STATUE.UP_LOAD_MORE);
                break;
            case 4:
                //下拉刷新 无上拉加载更多
                pullRecyclerViewUtils.setRecyclerviewStatue(PullRecyclerViewUtils.RECYCLRYVIEW_STATUE.PULL_REFRESH);
                break;
            default:
                //下拉刷新和上拉加载更多模式
                pullRecyclerViewUtils.setRecyclerviewStatue(PullRecyclerViewUtils.RECYCLRYVIEW_STATUE.PULL_AND_UP);
                break;
        }
        //----
        //5将recyclerview添加到当前显示的页面中
        maintContentLinearLayyout.addView(relativeLayout);


        //模拟网络
        new Handler(getMainLooper()).postDelayed(new Runnable() {
            @Override
            public void run() {

                List<DataModel> list = new ArrayList<>();
                for (int i = 0; i < 4; i++) {
                    DataModel dataModel = new DataModel();
                    dataModel.name = "小燕子的情怀" + i;
                    list.add(dataModel);
                }
                //更新数据
                //这里需要注意的是 每次设置的数据集合都是一个新的List对象
                pullRecyclerViewUtils.setLoadingDataList(list);
            }
        }, 3000);
2.2 回调监听

    /**
     * RecyclerView相关操作的回调
     */
    private PullRecyclerViewLinserner mPullRecclerLinserner = new

            PullRecyclerViewLinserner() {
                //当触发上拉加载更多时,回调此方法
                @Override
                public void loadMoreData() {
                    //模拟网络请求
                    new Handler(getMainLooper()).postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            //请求成功的数据集合
                            List<DataModel> list = new ArrayList<>();
                            for (int i = 0; i < 16; i++) {
                                DataModel dataModel = new DataModel();
                                dataModel.name = "小燕子的情怀" + i;
                                list.add(dataModel);
                            }
                            //更新数据
                            //这里的数据集合为新的list对象就可以
                            //内部自动处理了数据的延续添加刷新
                            pullRecyclerViewUtils.setLoadingDataList(list);
                        }
                    }, 3000);
                }

                //当触发下拉刷新数据时会回调此方法
                @Override
                public void loadingRefresDataFunction() {
                    //模拟网络请求
                    new Handler(getMainLooper()).postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            //请求成功的数据集合
                            List<DataModel> list = new ArrayList<>();
                            for (int i = 0; i < 16; i++) {
                                DataModel dataModel = new DataModel();
                                dataModel.name = "小燕子的情怀" + i;
                                list.add(dataModel);
                            }
                            //这里的数据集合为新的list对象就可以
                            //内部自动处理了数据的清空更新
                            pullRecyclerViewUtils.setLoadingDataList(list);
                        }
                    }, 3000);
                }

                //设置数据回调方法 

                /**
                 * 
                 * @param itemView  布局条目对应的View
                 * @param position 当前条目位置
                 * @param itemType 当前的条目布局类型
                 * @param object   数据模型
                 */
                @Override
                public void setViewDatas(View itemView, int position, int itemType, Object object) {

                    //对就的模型数据
                    DataModel dataModel = (DataModel) object;

                    //设置数据
                    TextView nameTextView = itemView.findViewById(R.id.tv_item_name);
                    nameTextView.setText(dataModel.name);
                }
            };

3 设置多布局样式

效果样式(例如这里设置了三种Item的样式)

3.1 初始化设置 (与2中描述的基本一至)

在这里需要注意的是 ,初始化操作Recyclerview方式与2中描述的基本一至,重要的是在为RecyclerView设置数据的时候,要构造多布局样式数据模型PullRecyclerMoreStatueModel

/**
 * Created by androidlongs on 2017/8/21.
 * 站在顶峰,看世界
 * 落在谷底,思人生
 */

public class PullRecyclerMoreStatueModel implements Serializable {
    //数据模型 
    public Object model;
    //布局类型
    public int itemType=-1;
    //布局ID
    public int itemLayoutId=-1;
}

        //当前页面 要显示列表数据的父布局
        LinearLayout maintContentLinearLayyout = findViewById(R.id.ll_content);


        //1初始化
        pullRecyclerViewUtils = PullRecyclerViewUtils.getInstance();

        //2数据集合
        final List<PullRecyclerMoreStatueModel> list = new ArrayList<>();

        //3初始化Recyclerview
        /**
         * 参数一 this Context实例
         * 参数二 单一布局模式条目布局ID 多布局模式下可以传-1
         * 参数三 数据集合
         * 参数四 回调监听
         */
        RelativeLayout relativeLayout = pullRecyclerViewUtils.setRecyclerViewFunction(this, -1, list, mPullRecclerLinserner);

        //4相关设置
        //----
        //设置RecyclerView的模式
        /**
         *
         * @param statue NORMAL,//正常状态下,没有下拉刷新也没有上拉加载更多
         *               PULL_REFRESH,//只有下拉刷新功能
         *               UP_LOAD_MORE,//只有上拉加载更多功能
         *               PULL_AND_UP//下拉刷新 上拉加载功能
         * @see PullRecyclerViewUtils.RECYCLRYVIEW_STATUE
         */
        //下拉刷新和上拉加载更多模式
        pullRecyclerViewUtils.setRecyclerviewStatue(PullRecyclerViewUtils.RECYCLRYVIEW_STATUE.PULL_AND_UP);


        //----
        //5将recyclerview添加到当前显示的页面中
        maintContentLinearLayyout.addView(relativeLayout);


        //模拟网络
        new Handler(getMainLooper()).postDelayed(new Runnable() {
            @Override
            public void run() {

                /**
                 * 多而布局样式下 需要使用 PullRecyclerMoreStatueModel 数据模型 将数据和其对应的布局样式封装
                 */
                List<PullRecyclerMoreStatueModel> list = new ArrayList<>();

                for (int i = 0; i < 14; i++) {
                    //网络请求的用户数据
                    DataModel dataModel = new DataModel();
                    dataModel.name = "小燕子的情怀" + i;

                    //构造多布局样式与数据模式
                    PullRecyclerMoreStatueModel moreStatueModel = new PullRecyclerMoreStatueModel();

                    moreStatueModel.model = dataModel;

                    if (i % 3 == 0) {
                        //第一种布局样式

                        moreStatueModel.itemLayoutId = R.layout.item_comm_base_layout;
                        moreStatueModel.itemType = 1;
                    } else if (i % 3 == 1) {
                        //第二种布局样式
                        moreStatueModel.itemLayoutId = R.layout.item_comm_base_2_layout;
                        moreStatueModel.itemType = 2;
                    } else {
                        //第三种布局样式
                        moreStatueModel.itemLayoutId = R.layout.item_comm_base_3_layout;
                        moreStatueModel.itemType = 3;
                    }

                    list.add(moreStatueModel);
                }
                //更新数据
                //这里需要注意的是 每次设置的数据集合都是一个新的List对象
                pullRecyclerViewUtils.setLoadingDataList(list);
            }
        }, 2000);

对应的回调设置数据中

private PullRecyclerViewLinserner mPullRecclerLinserner = new

            PullRecyclerViewLinserner() {
                //当触发上拉加载更多时,回调此方法
                @Override
                public void loadMoreData() {

                }

                //当触发下拉刷新数据时会回调此方法
                @Override
                public void loadingRefresDataFunction() {
                    //模拟网络请求

                }

                //设置数据回调方法

                /**
                 *
                 * @param itemView  布局条目对应的View
                 * @param position 当前条目位置
                 * @param itemType 当前的条目布局类型
                 * @param object   数据模型
                 */
                @Override
                public void setViewDatas(View itemView, int position, int itemType, Object object) {


                    //多布局模式下  object对应的数据类型是 PullRecyclerMoreStatueModel
                    PullRecyclerMoreStatueModel pullRecyclerMoreStatueModel = (PullRecyclerMoreStatueModel) object;
                    //获取对应的数据类型或者说是条目布局样式
                    itemType = pullRecyclerMoreStatueModel.itemType;

                    //根据itemType来获取对应的数据 与 设置对应的数据显示
                    if (itemType == 1) {
                        //对应就的模型数据
                        DataModel dataModel = (DataModel) pullRecyclerMoreStatueModel.model;
                        //设置数据
                        TextView nameTextView = itemView.findViewById(R.id.tv_item_name);
                        nameTextView.setText(dataModel.name);
                    } else if (itemType == 2) {
                        //对应的模型数据
                        DataModel dataModel = (DataModel) pullRecyclerMoreStatueModel.model;
                        //设置数据
                        TextView nameTextView = itemView.findViewById(R.id.tv_item_name);
                        nameTextView.setText(dataModel.name);
                    } else {
                        //对应的模型数据
                        DataModel dataModel = (DataModel) pullRecyclerMoreStatueModel.model;
                        //设置数据
                        TextView nameTextView = itemView.findViewById(R.id.tv_item_name);
                        nameTextView.setText(dataModel.name);
                    }


                }
            };
4 设置多布局样式

效果样式一(例如这里设置了蓝色的背景)


效果样式二(例如这里自定义了一个背景)

4.1 初始化设置 (与2中描述的基本一至)
4.2 设置刷新背景(纯色)
pullRecyclerViewUtils.setMainBackgroundRelativeLayoutColor(Color.BLUE);
4.3 设置刷新背景 (自定义视图)

在这里提供了两种设置方式

 //方式一 直接将自定义的背景样式xml 的ID设置
 pullRecyclerViewUtils.addMainBackgroundChildLayout(R.layout.item_refresh_bg_layout);

 //方式二 设置一个构造 好的View 
   View view = View.inflate(this,R.layout.item_refresh_bg_layout,null);
   pullRecyclerViewUtils.addMainBackgroundChildLayout(view);
4.4 设置刷新部位背景 (纯色)

    //下拉刷新部位的背景颜色 设置
    pullRecyclerViewUtils.setPullRefshBackGroundColor(Color.WHITE);
    //下拉刷新部位的显示文字的颜色
    pullRecyclerViewUtils.setPullRefshTextColorFunction(Color.BLUE);

5 设置下拉刷新部分的样式
   /**
     * @param statue PB_AND_TV,//显示 加载进度显示文字
     *               IV_AND_TV,//显示图片 加载进度显示文字
     *               PB,//只显示加载进度圈
     *               TV,//只显示加载文字
     *               IV//只显示加载图片
     * @see PULLREFSH_SHOW_VIEW_STATUE
     */
5.1 样式一 显示刷新圆形进度与文字
    //下拉刷新部位的背景颜色 设置
    pullRecyclerViewUtils.setPullRefshBackGroundColor(Color.WHITE);
    //下拉刷新部位的显示文字的颜色
    pullRecyclerViewUtils.setPullRefshTextColorFunction(Color.BLUE);
    //设置下拉刷新样式类型
    pullRecyclerViewUtils.setPullRefshStatue(PullRecyclerViewUtils.PULLREFSH_SHOW_VIEW_STATUE.PB_AND_TV);

5.2 样式二 只显示刷新文字
//设置下拉刷新样式类型
pullRecyclerViewUtils.setPullRefshStatue(PullRecyclerViewUtils.PULLREFSH_SHOW_VIEW_STATUE.TV);

5.3 样式三 只显示刷新圆形进度
//设置下拉刷新样式类型
pullRecyclerViewUtils.setPullRefshStatue(PullRecyclerViewUtils.PULLREFSH_SHOW_VIEW_STATUE.PB);

5.4 样式四 只显示自定义图片
//设置下拉刷新显示图片
pullRecyclerViewUtils.setPullRefshImageFunction(this.getResources().getDrawable(R.drawable.home_table_topic_header));
//设置下拉刷新样式类型
pullRecyclerViewUtils.setPullRefshStatue(PullRecyclerViewUtils.PULLREFSH_SHOW_VIEW_STATUE.IV);

5.5 样式五 只显示自定义帧动画
//设置下拉刷新显示 动画文件
pullRecyclerViewUtils.setPullRefshImageFunction(this.getResources().getDrawable(R.drawable.dra_pull_anim));
//设置下拉刷新样式类型
pullRecyclerViewUtils.setPullRefshStatue(PullRecyclerViewUtils.PULLREFSH_SHOW_VIEW_STATUE.IV);

5.6 样式六 显示自定义图片和文字
//设置下拉刷新显示 动画文件
pullRecyclerViewUtils.setPullRefshImageFunction(this.getResources().getDrawable(R.drawable.dra_pull_anim));
//设置下拉刷新样式类型
pullRecyclerViewUtils.setPullRefshStatue(PullRecyclerViewUtils.PULLREFSH_SHOW_VIEW_STATUE.IV_AND_TV);


6 设置首次进入页面后 无数据显示的样式
public enum SHOW_DEFAUTLE_PAGE_TYPE {
   NO_DATA,//无数据
   LOADING,//加载中
   NORMAL//列表数据页面
}
6.1 显示正在加载中的圆形进度与显示文字
pullRecyclerViewUtils.setFirstDefaultPageType(PullRecyclerViewUtils.SHOW_DEFAUTLE_PAGE_TYPE.LOADING);

6.2 显示暂无数据显示文字
pullRecyclerViewUtils.setFirstDefaultPageType(PullRecyclerViewUtils.SHOW_DEFAUTLE_PAGE_TYPE.NO_DATA);

6.3 显示空的列表页面
pullRecyclerViewUtils.setFirstDefaultPageType(PullRecyclerViewUtils.SHOW_DEFAUTLE_PAGE_TYPE.NORMAL);

早起的年轻人 CSDN认证博客专家 移动开发 项目管理 Java
只要用心去做,每一件事情还是有可能成功的,当然成功是没有界限的,只不过是达到自己心里的那个目标,公众号:我的大前端生涯,一个爱喝茶的程序员,通常会搞搞SpringBoot 、Herbinate、Mybatiys、Android、iOS、Flutter、Vue、小程序等.
©️2020 CSDN 皮肤主题: 代码科技 设计师:Amelia_0503 返回首页