mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
//newState为滑动状态,可利用该属性减少方法的频繁重复调用
//SCROLL_STATE_IDLE 静止没有滚动
//SCROLL_STATE_DRAGGING 正在被拖拽
//SCROLL_STATE_SETTLING 自动滚动,惯性滚动
}
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
}
});
RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
//判断是当前layoutManager是否为LinearLayoutManager
// 只有LinearLayoutManager才有查找第一个和最后一个可见view位置的方法
if (layoutManager instanceof LinearLayoutManager) {
LinearLayoutManager linearManager = (LinearLayoutManager) layoutManager;
//获取最后一个可见view的位置
int lastItemPosition = linearManager.findLastVisibleItemPosition();
//获取第一个可见view的位置
int firstItemPosition = linearManager.findFirstVisibleItemPosition();
//-1代表顶部,返回true表示没到顶,还可以滑
//1代表底部,返回true表示没到底部,还可以滑
boolean b = recyclerView.canScrollVertically(-1);
/**
* 复写该方法,注意删除原本的super调用,因为其内部调用的是两个参数的onBindViewHolder方法,这样一//来就没有意义了,还是去执行了一般的onBindViewHolder方法刷新了整个item
*/
@Override
public void onBindViewHolder(@NonNull TrendsHolder holder, int position, @NonNull List<Object> payloads) {
if(payloads.isEmpty()){
onBindViewHolder(holder, position);
}else {
int type = (int) payloads.get(0);
Result result = mData.get(position);
switch (type) {
case Constants.VIDEOACTION.DOWNLOAD:
holder.downloadNum.setText(formNum(result.getDownloadNum()));
break;
case Constants.VIDEOACTION.WATCH:
holder.watchNum.setText(formNum(result.getWatchNum()));
break;
case Constants.VIDEOACTION.SHARE:
holder.shareNum.setText(formNum(result.getShareNum()));
break;
}
}
}
//只要第二个参数不为null,便是调用上面的方法
notifyItemChanged(position,Constants.VIDEOACTION.SHARE);
参考:
new PagerSnapHelper().attachToRecyclerView(mRecyclerView);
可以使用 Support 包中的 DiffUtil 类,这是新版本官方提供的类,可以检测数据发生变化的位置,并进行更新,可以用该类来避免出现数据刷新后,数据与视图不匹配的问题。