RecyclerView使用ItemTouchHelper实现侧滑删除

RecyclerView使用ItemTouchHelper实现侧滑删除

一、目标

二、下载地址

神马笔记最新版本下载:【神马笔记 版本1.5.0——笔名功能.apk

三、功能设计

笔名共有4个部分组成——头像、昵称、个性签名、图片签名。

分享笔记时,增加一个时间信息。

因此,完整的笔名由5个部分组成。分成2组:

  1. 头像、昵称、时间、个性签名
  2. 图片签名

每组信息可以独立显示或者关闭。

笔名共有4种显示方式

  1. 二者都显示
  2. 只显示头像等信息
  3. 只显示图片签名
  4. 都不显示

分享时,默认为二者都显示。

可以通过向左滑动,关闭不需要的笔名信息。

四、准备工作

侧滑功能,使用ItemTouchHelper实现。

如何使用ItemTouchHelper可以参考《RecyclerView使用ItemTouchHelper实现拖拽排序》。

ItemTouchHelper同时支持拖拽和侧滑2种操作。

五、组合起来

1. SwipeCallback

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
private static class SwipeCallback extends ItemTouchHelper.Callback {

ShareArticleFragment parent;

SwipeCallback(ShareArticleFragment f) {
this.parent = f;
}

@Override
public boolean isLongPressDragEnabled() {
return false;
}

@Override
public int getMovementFlags(@NonNull RecyclerView recyclerView,
@NonNull RecyclerView.ViewHolder viewHolder) {
boolean enable = (viewHolder instanceof MasterViewHolder) || (viewHolder instanceof VisionViewHolder);

int dragDirs = 0;
int swipeDirs = (enable)? ItemTouchHelper.LEFT: 0;

return makeMovementFlags(dragDirs, swipeDirs);
}

@Override
public boolean onMove(@NonNull RecyclerView recyclerView,
@NonNull RecyclerView.ViewHolder viewHolder,
@NonNull RecyclerView.ViewHolder target) {
return false;
}

@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
parent.requestSwipe(viewHolder, direction);
}
}

2. 处理侧滑操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
void requestSwipe(RecyclerView.ViewHolder viewHolder, int direction) {
if (direction != ItemTouchHelper.LEFT) {
return;
}

if (viewHolder instanceof MasterViewHolder) {
Object obj = masterHelper.masterItem;
int index = provider.indexOf(obj);
if (index >= 0) {
provider.remove(index);
adapter.notifyItemRemoved(index);
}
} else if (viewHolder instanceof VisionViewHolder) {
Object obj = masterHelper.visionItem;
int index = provider.indexOf(obj);
if (index >= 0) {
provider.remove(index);
adapter.notifyItemRemoved(index);
}
}

if (masterHelper.isGone()) {
Object obj = masterHelper.separatorItem;
int index = provider.indexOf(obj);
if (index >= 0) {
provider.remove(index);
adapter.notifyItemRemoved(index);
}
}

}

六、Finally

~劝君更尽一杯酒~西出阳关无故人~