RecyclerView中notifyDataSetChanged刷新总结

除了adapter.notifyDataSetChanged()这个方法以外,新的Adapter还提供了其余的方法,以下:api

public final void notifyDataSetChanged()
public final void notifyItemChanged(int position)
public final void notifyItemRangeChanged(int positionStart, int itemCount)
public final void notifyItemInserted(int position)
public final void notifyItemMoved(int fromPosition, int toPosition)
public final void notifyItemRangeInserted(int positionStart, int itemCount)
public final void notifyItemRemoved(int position)
public final void notifyItemRangeRemoved(int positionStart, int itemCount)

基本上看到方法的名字就知道这个方法是干吗的了,动画

第一个方法没什么好讲的,跟之前同样。spa

notifyItemChanged(int position),position数据发生了改变,那调用这个方法,就会回调对应position的onBindViewHolder()方法了,固然,由于ViewHolder是复用的,因此若是position在当前屏幕之外,也就不会回调了,由于没有意义,下次position滚动会当前屏幕之内的时候一样会调用onBindViewHolder()方法刷新数据了。其余的方法也是一样的道理。code

public final void notifyItemRangeChanged(int positionStart, int itemCount),顾名思义,能够刷新从positionStart开始itemCount数量的item了(这里的刷新指回调onBindViewHolder()方法)。blog

public final void notifyItemInserted(int position),这个方法是在第position位置被插入了一条数据的时候可使用这个方法刷新,注意这个方法调用后会有插入的动画,这个动画可使用默认的,也能够本身定义。rem

public final void notifyItemMoved(int fromPosition, int toPosition),这个方法是从fromPosition移动到toPosition为止的时候可使用这个方法刷新get

public final void notifyItemRangeInserted(int positionStart, int itemCount),显然是批量添加。it

public final void notifyItemRemoved(int position),第position个被删除的时候刷新,一样会有动画。io

public final void notifyItemRangeRemoved(int positionStart, int itemCount),批量删除。class

 

这些方法分析完以后,咱们来实现一个点击一个按钮,新增一条数据,长按一个item,删除一条数据的场景。

如下是新增一条数据的代码:

Person person = new Person(i, "WangJie_" + i, 10 + i);
adapter.notifyItemInserted(2);
personList.add(2, person);
adapter.notifyItemRangeChanged(2, adapter.getItemCount());

如上代码:

Line2:表示在position为2的位置,插入一条数据,这个时候动画开始执行。

Line3: 表示在数据源中position为2的位置新增一条数据(其实这个才是真正的新增数据啦)。

Line4: 为何要刷新position为2之后的数据呢?由于,在position为2的位置插入了一条数据后,新数据的position变成了2,那原来的position为2的应该变成了3,3的应该变成了4,因此2之后的全部数据的position都发生了改变,因此须要把position2之后的数据都要刷新。理论上是这样,可是实际上刷新的数量只有在屏幕上显示的position为2之后的数据而已。若是这里使用notifyDataSetChanged()来刷新屏幕上显示的全部item能够吗?结果不会出错,可是会有一个问题,前面调用了notifyItemInserted()方法后会在执行动画,若是你调用notifyDataSetChanged()刷新屏幕上显示的全部item的话,必然也会刷新当前正在执行动画的那个item,这样致使的结果是,前面的动画还没执行完,它立刻又被刷新了,动画就看不见了。因此只要刷新2之后的item就能够了。

 

看了RecyclerView的api,发现没有setOnItemClickListener--,因此仍是本身把onItemClick从Adapter中回调出来吧。这个很简单,就像上面PersonAdaper中写的OnRecyclerViewListener那样。

 

长按删除的代码以下:

adapter.notifyItemRemoved(position);
personList.remove(position);
adapter.notifyItemRangeChanged(position, adapter.getItemCount());

代码跟以前插入的代码基本一致。先通知执行动画,而后删除数据源中的数据,而后通知position以后的数据刷新就能够了。

相关文章
相关标签/搜索