实现RecyclerView预加载及点击item按钮删除功能(局
2017-08-02 本文已影响169人
wl_tao
一、RecyclerView上拉实现预加载
在RecyclerView的滑动监听中,上拉时,通过判断视图最后可见位置findLastVisibleItemPosition()与item的总数目进行对比,在未滑到最后一个item时加载数据,这样可以不必等待加载数据过程
1、创建自己的滑动监听器extends RecyclerView.OnScrollListener,重写onScrolled
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
int itemCount = recyclerView.getAdapter().getItemCount();
int lastVisualItem = ((LinearLayoutManager) recyclerView.getLayoutManager()).findLastVisibleItemPosition();
//此处表示剩余4个item时加载数据,可自己设置
if (itemCount - 4 <= lastVisualItem) {
Log.d("TAG", " onScrolled---> " + " itemCount " + itemCount + " lastVisualItem " + lastVisualItem);
ChannelPresenter channelPresenter = ((ChannelActivity) mActivity).getChannelPresenter();
//加载数据方法
channelPresenter.loadMoreData(mPosition);
//往RecyclerView中插入新的数据,channelPresenter.getLoadMoreNum()为加载数据的数目,使用notifyItemInserted,无需使用notifyDataSetChanged()来刷新所有数据
for (int i = itemCount; i < itemCount + channelPresenter.getLoadMoreNum(); i++) {
recyclerView.getAdapter().notifyItemInserted(i);
}
}
}
二、点击item中的button删除item,并在剩余数据不足时自动加载item
1、从RecyclerView的Adapter的onAttachedToRecyclerView中获取LayoutManager
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
mRecyclerView=recyclerView;
mLinearLayoutManager=(LinearLayoutManager) recyclerView.getLayoutManager();
}
2、在onBindViewHolder中对于控件添加监听事件,通过mLinearLayoutManager.findLastVisibleItemPosition()获取最后一个可见item的position
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int lastVisiblerPosition=mLinearLayoutManager.findLastVisibleItemPosition();
//getItemCount()为RecyclerView.Adapter的方法,获取总的item数目,6可根据情况自己设置,此处表示剩余6个item时加载数据;
if(getItemCount()- 6 <= lastVisiblerPosition) {
Log.d("TAG", " onScrolled---> " + " getItemCount " + getItemCount() + " lastVisiblerPosition " + lastVisiblerPosition);
ChannelPresenter channelPresenter = ((ChannelActivity) mContext).getChannelPresenter();
//数据加载,mPosition可忽略,写自己的数据加载方法
channelPresenter.loadMoreData(mPosition);
}
//获取当前item的position
int myPosition=holder.getLayoutPosition();
//从数据list中删除对应position的数据
mChannelContentList.remove(myPosition);
//只需删除对应position的item,后续item的position会对应减1,这样就不需要notifyDataSetChanged()来刷新所有数据
notifyItemRemoved(myPosition);
Log.d("TAG", " onClick ViewTag---> " + myPosition);