在上一篇文章“RecyclerView(二)设置监听”中,已经介绍如何为RecyclerView的item添加点击和长按事件的监听器,但是监听这些事件肯定得做某些操作,不然监听了也没有什么意义,这篇文章就记录一下如何对RecyclerView的数据进行操作,大家可以结合点击事件来实现点击修改数据或者长按删除数据等,同样,这篇文章也是建立在之前的代码基础之上的。
RecyclerView具有高度自由性,其中一个原因也是它可以进行局部刷新,所以想往RecyclerView的Adapter中增、删、改单个数据是很方便的,官方API为我们提供了以下方法:
//该方法用于当增加一个数据的时候,position表示新增数据显示的位置
final void notifyItemInserted(int position)
//该方法用于删除一个数据的时候,position表示数据删除的位置
final void notifyItemRemoved(int position)
//该方法表示所在position对应的item位置不会改变,但是该item内容发生变化
final void notifyItemChanged(int position)
//该方法一般用于:适配器之前装载的数据大部分已经过时了,需要重新更新数据
//调用该方法的时候,recyclerView会重新计算子item及所有子item重新布局
//出于效率考虑,官方建议用更加精确的方法(比如上面三个方法)来取代这个方法
final void notifyDataSetChanged()
这几个方法还是很容易理解的,然后我们就可以在TestAdapter增加几个方法:
//移除数据
public void removeData(int position) {
stringList.remove(position);
notifyItemRemoved(position);
}
//新增数据
public void addData(int position) {
stringList.add(position, "Add One");
notifyItemInserted(position);
}
//更改某个位置的数据
public void changeData(int position) {
stringList.set(position, "Item " + position + " has changed");
notifyItemChanged(position);
}
在原来的MainActivity.xml布局上添加两个按钮:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/btn_add"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="add" />
<Button
android:id="@+id/btn_change"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="change" />
</LinearLayout>
然后在MainActivity中处理一下这两个Button的点击事件,调用TestAdapter中的addData()和changeData()方法:
rvTest.addOnItemTouchListener(new RecyclerViewClickListener(this, rvTest,
new RecyclerViewClickListener.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
Toast.makeText(MainActivity.this, "Click " + getList().get(position), Toast.LENGTH_SHORT).show();
}
@Override
public void onItemLongClick(View view, int position) {
mTestAdapter.removeData(position);
Toast.makeText(MainActivity.this, "Remove " + getList().get(position), Toast.LENGTH_SHORT).show();
}
}));
重新运行程序,应该可以看到下面效果:
可以看到,数据被正确的增、删、改了。而且这增删改的过程中,不是很突兀的直接变化,而是有一个小动画效果,使得看起来很舒服,它就是使用了RecyclerView默认提供的动画效果。
//这行代码不是必须的,因为RecyclerView会默认使用
rvTest.setItemAnimator(new DefaultItemAnimator());
还有item之间的分割线,关于动画效果和分割线会在单独的篇幅作记录