Android RecyclerView (十)组件化封装

来源:互联网 发布:qt 调用dotnet 编程 编辑:程序博客网 时间:2024/06/05 08:32

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);

原创粉丝点击