Android里显示列表数据,基本上都用RecyclerView了。有时我们经常要刷新列表数据,这时候我们会使用notifyDataSetChanged方法,但是这种做法太暴力了。将所有的item都刷新了一遍,如果你的item全是静态的都还好说,要是有个动画或者别的东西,你懂得全是闪烁。特别是还有一种需求就是只需要刷新Item的子View,实现局部刷新。这个是时候用notifyDataSetChanged就不是特别的友好了。那么,一般就两种做法:第一种就是通过recyclerview的findViewHolderForAdapterPosition方法找到那个item所在的viewholder直接拿到viewholder进行操作,不过这种方法存在弊端,就是只能获取当前屏幕所显示的viewholder,如果不在当前屏幕那就会获取的是一个null。所以在使用的时候应该通过manager.findFirstVisibleItemPosition()和manager.findLastVisibleItemPosition()判断要改变的item的position是否在这区间内。第二种方式通过layoutManager.findViewByPosition()获取view 注意的地方也是和第一种一样。
所幸的是,还有一种方法可以实现局部刷新,那就是 corverAdapter.notifyItemChanged(logPosition,"update").第二个参数任意类型的参数,还需要在适配器中重写onBindViewHolder(ViewHolder holder, int position, List
public void onBindViewHolder(JobViewHolder holder, int position, List payloads) {
//payloads 为空,说明是更新整个ViewHolder
if (payloads.isEmpty()) {
onBindViewHolder(holder, position); //绑定数据
}else {//刷新倒计时所在的View
JobDetailBean bean =jobList.get(position);
//处理保姆邀约订单的倒计时
if (bean.getPositionType() == UserIdentity.getInstance(mContext).CSBAOMU && bean.getJobType() !=1) {//1普通订单
holder.divider.setVisibility(View.VISIBLE);
holder.layout_invite_order.setVisibility(View.VISIBLE);
holder.bindData(bean); //具体要刷新的子View要做的事情
}else {
holder.divider.setVisibility(View.GONE);
holder.layout_invite_order.setVisibility(View.GONE);
}
}
}
我们只需要在适当的时机调用adapter.notifyItemChanged(position, "update")就可以实现局部刷新