RecyclerView实现Item的局部刷新

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 payloads)方法,第三个参数大小只有1.它的值就是我们之前传入的“update”。我们可以在这里实现我们想要做的局部刷新操作。如果payloads为空集的话我们就调用 onBindViewHolder(holder,position)方法,如果payloads不为空那我们就可以从集合中拿到数据然后自己去改变我们想要的一些布局。以项目代码为例,我们来看一下:

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")就可以实现局部刷新

你可能感兴趣的:(RecyclerView实现Item的局部刷新)