1、问题描述1:RecyclerView中顶部嵌套WebView时,底部操作点赞或者置顶等操作使用Item更新方法 notifyItemChanged(int position)更新时WebView出现闪动问题;
问题描述2:在Item中操作点赞按钮, notifyItemChanged(int position)更新整个Item时,头像、图片等其他控件出现闪动问题
2、解决办法:
问题描述2:可通过去除RecyclerView的动画效果达到更新Item时不出现头像、图片等控件的闪动问题
((DefaultItemAnimator) mRecyclerView.getItemAnimator()).setSupportsChangeAnimations(false);//去除动画,防止点赞头像等出现闪动问题(Adapter采用局部更新后可以不用设置)
问题描述1:通过禁用动画无法解决X5WebView出现的闪动问题,可通过RecyclerView的Item的局部更新方法来解决,参考3.
3、RecyclerView的Item的局部更新方法:
第一步:重写onBindViewHolder(@NonNull VH holder, int position,@NonNull List payloads)
/**
* Item局部更新
*
* @param holder
* @param position 界面布局位置
* @param payloads
*/
@Override
public void onBindViewHolder(ViewHolder holder, int position,List<Object> payloads) {
if(payloads.isEmpty()){//payloads.isEmpty() 注意判断条件写法
onBindViewHolder(holder, position);
}else{
switch (holder.getItemViewType()) {
case TYPE_HEADER://顶部要更新的局部控件设置数据的方法
holder.mViewZanHeader.setText(“”);//headerView中点赞数
break;
case TYPE_CONTENT://Item中要更新的局部控件设置数据的方法
holder.mViewZanItem.setText(“”);//Item中点赞数
break;
}
}
}
第二步:adapter中封装局部更新的方法notifyItemChanged(Data dataValue,int type)
内部使用notifyItemChanged(int position, @Nullable Object payload)进行更新
/**
* Item局部更新:更新点赞数
* @param mDataValue
* @param type 0 点赞 1置顶... 用来标记要更新的控件
*/
public void notifyItemChanged(DataHeader mDataValue,int type) {
this.typeUpdate=type;
this.mDataValue = mDataValue;
notifyItemChanged(0,mDataValue);
}
/**
* Item局部更新:更新点赞数
* @param position
* @param listBean
* @param type 0:点赞 1:置顶... 用来标记要更新的控件
*/
public void notifyItemChanged(int position,ItemListBean listBean,int type) {
if(mList!=null){
mList.set(position,listBean);
}
this.typeUpdate=type;
notifyItemChanged(position+1,listBean);//注意,添加过一个HeaderView,列表数据需要+1
}
第三步:在Activity或者Fragment中通过Adapter调用第二步封装的方法即可(注意可以在页面中更新数据源也可以在第二步封装的方法中更新,看个人习惯)