RecycleView 滑动优化

在RecycleView设置是否滚动变量,然后在滚动监听器的onScrollStateChanged()方法中给boolean值赋值,看是否在滚动。 
这样在我们使用这个适配器的时候,就可以根据滚动状态的不同来判断:比如正在滚动的时候就只显示内存缓存的图片,如果内存缓存中没有就显示一张默认图片;而如果没有在滚动就采用正常的图片加载方案去加载网络或者缓存中的图片。
同理,影响RecycleView滑动性能的耗时操作都可以采用这种策略,滚动的时候不进行耗时操作,停止的时候才进行,注意在
onScrollStateChanged当停止后需要刷新RecycleView。


ContactListView:

private boolean mIsScrolling = false;//监听是否滚动


mRecyclerView = (RecyclerView) findViewById(R.id.contact_list);

mRecyclerView.setHasFixedSize(true);

mLinearLayoutManager = new WrapContentLinearLayoutManager(mContext, LinearLayoutManager.VERTICAL, false);
mRecyclerView.setLayoutManager(mLinearLayoutManager);
mAdapter = new ContactListAdapter(this);
mRecyclerView.setAdapter(mAdapter);
mRecyclerView.addOnScrollListener(new ScrollListener());
private class ScrollListener extends OnScrollListener{
    @Override
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
        super.onScrollStateChanged(recyclerView, newState);
        LogF.e("aa1","newState:"+newState);
        if(newState == RecyclerView.SCROLL_STATE_SETTLING){
            //屏幕惯性滚动
            mIsScrolling = true;
        }else if(newState == RecyclerView.SCROLL_STATE_DRAGGING){
            //手指触摸滚动
            mIsScrolling = false;
        }else{//这个idle状态在数据刷新后再调用,导致无法及时更新,所以在这调用多一次notifydatachange
            mIsScrolling = false;
            mAdapter.notifyDataSetChanged();

           /* int firstVisibleItem = mLinearLayoutManager.findFirstVisibleItemPosition();
            int lastVisibleItem = mLinearLayoutManager.findLastVisibleItemPosition();
            mAdapter.notifyItemRangeChanged(firstVisibleItem,lastVisibleItem - firstVisibleItem);*/
        }
    }



ContactListAdapter:
ContactListView mContactListView;
ViewHolderItemClickListener mViewHolderItemClickListener;//item点击事件
public ContactListAdapter(ContactListView contactListView) {
    RcsCapHelper.getInstance().addRcsCapNotifyListener(this);
    mContactListView = contactListView;
}


if(mContactListView.isScrolling()){
    //滑动只读缓存头像
    String phone = mCurrentContact.getNumber();
    Log.e("aa1","is scrolling:"+mCurrentContact.getName());
//读取缓存,若没有则显示默认
    loadPhotoFromCache(mcontactImage, mCurrentContact.getNumber());

}else{
    //采用glide读取头像,缓存没有读取网络
    Log.e("aa1","not scrolling :"+mCurrentContact.getName());
 
    loadPhoto(App.getAppContext(), mcontactImage, mCurrentContact.getNumber());
}


 

    原文作者:ts_learner
    原文地址: https://blog.csdn.net/TS_learner/article/details/71727976
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞