列表页面的刷新经常会尝试去对某一个position的item做刷新处理,这时如果调用adapter的notifyItemChanged(int position)的方法,对应positon的item会闪动一下,体验不友好。经多番网上查阅资料后找到了比较可靠的解决方案。
局部刷新调用adapter的notifyItemChanged(int position, Object payload)的方法。然后对应的adapter 重写onBindViewHolder(RecyclerView.ViewHolder holder, int position, List payloads)。
#以下为示例代码:
1.adapter代码
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position, List<Object> payloads){
if (payloads.isEmpty()) {
onBindViewHolder(holder, position);
} else {
onBindItemHolder(holder, position);
}
}
private void onBindItemHolder(RecyclerView.ViewHolder holder, int position) {
int viewType = getItemViewType(position);
if (viewType == 0) {
((IndividualInfoViewHolder) holder).bindSomeData(mFunctionEntities.get(position));
}
}
2.ViewHolder(IndividualInfoViewHolder)代码
public void bindSomeData(MineFunctionEntity dataModel) {
RoundedImageView rivAvatar = itemView.findViewById(R.id.riv_avatar);
String imgurl = dataModel.getExtra();
if (!TextUtils.isEmpty(imgurl) && !imgurl.contains("http")) {
imgurl = Constant.IMG_HOST + imgurl;
}
GlideUtils.loadImageAsBitmap2(mContext, imgurl, rivAvatar);
TextView tvNickName = itemView.findViewById(R.id.tv_nickname);
tvNickName.setText(dataModel.getName());
}
如此便可以解决__局部刷新item闪动__的问题,同时可以有选择地更新item中某一个控件的内容。
出现该问题并不是有些开发者提到的诸如“recyclerView刷新时自带动画”、“图片库默认加载图片的动画”等等问题。
参考文章:
https://wetest.qq.com/lab/view/176.html?from=adsout_qqtips_past2&sessionUserType=BFT.PARAMS.201129.TASKID&ADUIN=1217543868&ADSESSION=1477044282&ADTAG=CLIENT.QQ.5503_.0&ADPUBNO=26638