1、在Adapter的onBindViewHolder方法中做一个开关控制,当为true时加载图片,否则ImageView添加占位图片。
protected boolean isScrolling = true;
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
if (isScrolling) {
// 这里可以用Glide、Picasso等网络图片加载库
} else {
holder.ImageView.setImageResource(占位图);
}
super.onBindViewHolder(holder, position);
}
2、在UI层做 onScrollStateChanged()的监听事件,if (newState == SCROLL_STATE_IDLE) 以及 y < 10 那么刷新item并且打开可以加载图片的开关。y < 10 表示RecyclerView滚动的速度趋近于停止时。
private int y = 0;
RecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
/*正在拖拽*/
// RecyclerView.SCROLL_STATE_DRAGGING:
/*滑动停止*/
// RecyclerView.SCROLL_STATE_IDLE:
/*惯性滑动中*/
// RecyclerView.SCROLL_STATE_SETTLING:
if (newState == SCROLL_STATE_IDLE && y < 10) {
// 滚动静止时才加载图片资源
adapter.setScrolling(false);
// 调用onBindViewHolder重新渲染item视图
adapter.notifyDataSetChanged();
} else{
adapter.setScrolling(true);
}
super.onScrollStateChanged(recyclerView, newState);
}
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
y = dy;
}
});
3、解决刷新视图时可能会出现闪烁跳动的问题,在Adapter中加入
@Override
public long getItemId(int position) {
return position;
}