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