issue

实现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);
上一篇 下一篇

猜你喜欢

热点阅读