包装RecyclerView的Adapter实现上拉加载更多

包装RecyclerView的Adapter实现上拉加载更多

前言描述

ListView中的上拉加载更多一般都是通过添加addFooterView()来完成的,RecyclerView已经使用了比较长的时间了,现在基本上能用ListView都可以用RecyclerView,但是两者还是有着很大的不同,本文通过来包装Adapter来实现上拉加载更过的需求。这也是现在比较流行的一种实现方式。

主要的实现步骤

和普通的列表相比,带加载更多的列表多了一个尾巴,来显示加载中和没有更多数据。

在RecyclerView里可以通过绑定不同的holder来实现这种效果,就是多类型的条目在一个列表。

步骤一:

我们需要准备两个holder,一个是加载中,一个是没有更多数据。

然后是创建holder的时候,根据目前列表处于什么位置来进行不同的holder的创建标识,通过不同的viewType来创建不同的holder;然后在绑定holder的时候,来真正的返回。

下面是代码:

这里就是根据列表滑动的位置来设置不同的条目类型
@Override
    public int getItemViewType(int position) {
        if (getItemCount() - 1 == position) {
            if (isLoadFinish) {
                return R.layout.item_finish_layout;
            } else {
                return R.layout.item_loading_layout;
            }
        } else {

            return dateBaseAdapter.getItemViewType(position);
        }
    }
返回了不同的条目后,就可以在创建holder的时候区分开来做了。
@Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == R.layout.item_loading_layout) {
            View view = LayoutInflater.from(parent.getContext()).inflate(viewType, parent, false);
            return new LoadingItem(view);
        } else if (viewType == R.layout.item_finish_layout) {
            View view = LayoutInflater.from(parent.getContext()).inflate(viewType, parent, false);
            return new FinishItem(view);
        } else {
            return dateBaseAdapter.onCreateViewHolder(parent, viewType);
        }

    }
最后就是绑定的操作了,因为创建了不同的holder所以在绑定的时候,可以通过区分不同的holder来做不同的操作
@Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if (holder instanceof WrapperAdapter.LoadingItem) {
            //加载更多的数据
            loadMoreDate();
        } else if (holder instanceof WrapperAdapter.FinishItem) {
        } else {
            dateBaseAdapter.onBindViewHolder(holder, position);
        }
    }
如果可以加载更多的话,就去调用loadMoreDate方法,就是一个监听成功失败,并且里面还有一个是不是加载完成的标识isLoadFinish。
if (listener != null) {
            listener.onload(pageSize, new ILoadCallBack() {
                @Override
                public void onSucess() {
                    notifyDataSetChanged();
                    pageSize = pageSize + 1;
                    isLoadFinish = false;
                }

                @Override
                public void onFail() {
                    isLoadFinish = true;
                }
            });
        }

以上就是比较核心的步骤了,手动写起来的话还是有一点难度的,不过自己写过之后可以加深对RecyclerView用法的理解,并且可以更好的使用。

下面介绍如何使用

首先还是正常的使用RecyclerView的步骤,代码如下:

//创建适配器,赋值
 rlv = (RecyclerView) findViewById(R.id.rlv);
dateBaseAdapter = new DateBaseAdapter(this);
dateBaseAdapter.addDataList(objects);
//****这里是重点*****//
//把我们写好的适配器放到我们包装适配器中,来获取下来加载更多的功能。
WrapperAdapter stringWrapperAdapter = new WrapperAdapter<>(dateBaseAdapter, 20, new WrapperAdapter.OnloadMore() {
            @Override
            public void onload(int page, final WrapperAdapter.ILoadCallBack callBack) {
                if (page < 5) {
                    viewById.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            callBack.onSucess();
                            dateBaseAdapter.addDataList(objects);
                        }
                    }, 1000);
                } else {
                    callBack.onFail();

                }
            }
        });

//****这里是重点*****//
//设置布局管理器
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
 viewById.setLayoutManager(linearLayoutManager);
//添加分割线
 viewById.addItemDecoration(new DividerItemDecoration(this, LinearLayoutManager.HORIZONTAL));
//设置给RecyclerView
 viewById.setAdapter(stringWrapperAdapter);

整个的流程走下来,增加对控件特性的了解,也能够更熟练的使用。

源码点这里

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值