服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - Android使用ItemTouchHelper实现侧滑删除和拖拽

Android使用ItemTouchHelper实现侧滑删除和拖拽

2022-07-19 10:41showdy Android

这篇文章主要为大家详细介绍了Android使用ItemTouchHelper实现侧滑删除和拖拽,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了如何使用ItemTouchHelper实现侧滑删除和拖拽的具体代码,供大家参考,具体内容如下

1. 定义一个简单bean类:

?
1
2
3
4
public class ImgText {
  public int resId;
  public String des;
}

2. 实现一个RecyclerView.Adapter

?
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
37
38
39
public class SwipeRecyclerAdapter extends RecyclerView.Adapter<SwipeRecyclerAdapter.MyHolder> {
 
  private List<ImgText> mList;
 
  public SwipeRecyclerAdapter(List<ImgText> list) {
    mList = list;
  }
 
  @Override
  public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
 
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_swipe_recycler, parent, false);
    return new MyHolder(view);
  }
 
  @Override
  public void onBindViewHolder(MyHolder holder, int position) {
    ImgText imgText = mList.get(position);
    holder.img.setImageResource(imgText.resId);
    holder.des.setText(imgText.des);
  }
 
  @Override
  public int getItemCount() {
    return mList.size();
  }
 
  public class MyHolder extends RecyclerView.ViewHolder {
 
    private ImageView img;
    private TextView des;
 
    public MyHolder(View itemView) {
      super(itemView);
      img = (ImageView) itemView.findViewById(R.id.img);
      des = (TextView) itemView.findViewById(R.id.text);
    }
  }
}

3.绘制分割线:

?
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
public class DividerItemDecoration extends RecyclerView.ItemDecoration {
  private static final int[] ATTRS = new int[]{android.R.attr.listDivider};
  public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;
  public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;
  private Drawable mDivider;
  private int mOrientation;
  public DividerItemDecoration(Context context, int orientation) {
    final TypedArray a = context.obtainStyledAttributes(ATTRS);
    mDivider = a.getDrawable(0);
    a.recycle();
    setOrientation(orientation);
  }
  public void setOrientation(int orientation) {
    if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) {
      throw new IllegalArgumentException("invalid orientation");
    }
    mOrientation = orientation;
  }
  @Override
  public void onDraw(Canvas c, RecyclerView parent) {
    if (mOrientation == VERTICAL_LIST) {
      drawVertical(c, parent);
    } else {
      drawHorizontal(c, parent);
    }
  }
  public void drawVertical(Canvas c, RecyclerView parent) {
    final int left = parent.getPaddingLeft();
    final int right = parent.getWidth() - parent.getPaddingRight();
    final int childCount = parent.getChildCount();
    for (int i = 0; i < childCount; i++) {
      final View child = parent.getChildAt(i);
      RecyclerView v = new RecyclerView(
          parent.getContext());
      final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
          .getLayoutParams();
      final int top = child.getBottom() + params.bottomMargin;
      final int bottom = top + mDivider.getIntrinsicHeight();
      mDivider.setBounds(left, top, right, bottom);
      mDivider.draw(c);
    }
  }
  public void drawHorizontal(Canvas c, RecyclerView parent) {
    final int top = parent.getPaddingTop();
    final int bottom = parent.getHeight() - parent.getPaddingBottom();
 
    final int childCount = parent.getChildCount();
    for (int i = 0; i < childCount; i++) {
      final View child = parent.getChildAt(i);
      final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
          .getLayoutParams();
      final int left = child.getRight() + params.rightMargin;
      final int right = left + mDivider.getIntrinsicHeight();
      mDivider.setBounds(left, top, right, bottom);
      mDivider.draw(c);
    }
  }
  @Override
  public void getItemOffsets(Rect outRect, int itemPosition,
                RecyclerView parent) {
    if (mOrientation == VERTICAL_LIST) {
      outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
    } else {
      outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
    }
  }
}

4. 实现ItemTouchHelper.Callback接口:

?
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
37
38
39
40
41
42
43
44
45
public class SwipeCallback<T> extends ItemTouchHelper.Callback {
 
  private RecyclerView.Adapter<? extends RecyclerView.ViewHolder> mAdapter;
  private List<T> mList;
 
  public SwipeCallback(RecyclerView.Adapter adapter, List<T> list) {
    mAdapter = adapter;
    mList = list;
  }
 
  @Override
  public boolean isLongPressDragEnabled() {
    return true;
  }
 
  @Override
  public boolean isItemViewSwipeEnabled() {
    return true;
  }
 
 
  @Override
  public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
    int dragFlag=ItemTouchHelper.UP|ItemTouchHelper.DOWN;
    int swipeFlags=ItemTouchHelper.END|ItemTouchHelper.START;
 
    return makeMovementFlags(dragFlag,swipeFlags);
  }
 
  //用于移动item的位置
  @Override
  public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
    Collections.swap(mList, viewHolder.getAdapterPosition(), target.getAdapterPosition());
    mAdapter.notifyItemMoved(viewHolder.getAdapterPosition(), target.getAdapterPosition());
 
    return true;
  }
 
  //一般用于滑动删除
  @Override
  public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
    mList.remove(viewHolder.getAdapterPosition());
    mAdapter.notifyItemRemoved(viewHolder.getAdapterPosition());
  }
}

5.编写侧滑删除和拖拽Activity

?
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
public class SwipeRecyclerViewActivity extends AppCompatActivity {
  private RecyclerView mRecyclerView;
 
  private List<ImgText> mList;
 
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_swipe_recycler);
    mRecyclerView= (RecyclerView) findViewById(R.id.recycler);
    mList=new ArrayList<>();
 
    for (int i = 0; i < 20; i++) {
      ImgText it= new ImgText();
      it.resId=R.mipmap.ic_launcher;
      it.des=i+"侧滑删除文字";
      mList.add(it);
    }
 
    final SwipeRecyclerAdapter adapter= new SwipeRecyclerAdapter(mList);
    RecyclerView.LayoutManager manager= new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
    mRecyclerView.setLayoutManager(manager);
    mRecyclerView.setItemAnimator(new DefaultItemAnimator());
    mRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST));
    mRecyclerView.setAdapter(adapter);
    ItemTouchHelper swipeItemHelper= new ItemTouchHelper(new SwipeCallback<>(adapter,mList));
    swipeItemHelper.attachToRecyclerView(mRecyclerView);
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/showdy/article/details/51578150

延伸 · 阅读

精彩推荐
  • AndroidAndroid实现图片轮播切换实例代码

    Android实现图片轮播切换实例代码

    利用Android的ViewFlipper和AnimationUtils实现图片带有动画的轮播切换,其中当点击“上一张”图片时,切换到上一张图片;当点击“下一张”图片时,切换到下...

    Android开发网6132021-04-20
  • AndroidAndroid实现水波纹扩散效果的实例代码

    Android实现水波纹扩散效果的实例代码

    这篇文章主要介绍了Android实现水波纹扩散效果的实例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    LiuJun2Son5962022-02-22
  • AndroidAndroid仿百度福袋红包界面

    Android仿百度福袋红包界面

    过年了,红包来袭,红包是怎么来的大家知道吗?这篇文章主要介绍了Android仿百度福袋红包界面,感兴趣的小伙伴们可以参考一下...

    Git_Android5722021-05-24
  • AndroidAndroid开发之TableLayout表格布局

    Android开发之TableLayout表格布局

    这篇文章主要为大家详细介绍了Android开发之TableLayout表格布局,表格布局模型是以行列的形式管理子控件,对TableLayout表格布局感兴趣的小伙伴们可以参考...

    许佳佳2335802021-07-24
  • AndroidAndroid文件下载进度条的实现代码

    Android文件下载进度条的实现代码

    我们今天开始学习的是下载进度的实现。今天的这段代码是网上找的,自己做了些小改,通过模拟器测试。文件下载进度条控制(就是为了高清壁纸加个进...

    Android开发网7552021-01-04
  • AndroidAndroid selector背景选择器的使用详解

    Android selector背景选择器的使用详解

    本篇文章是对Android中selector背景选择器的使用进行了详细的分析介绍,需要的朋友参考下...

    Android开发网7092021-01-28
  • AndroidAndroid字符串和十六进制相互转化出现的中文乱码问题

    Android字符串和十六进制相互转化出现的中文乱码问题

    这篇文章主要介绍了Android字符串和十六进制相互转化出现的中文乱码问题的相关资料,需要的朋友可以参考下...

    灬布衣丶公爵丨4122021-05-24
  • AndroidAndroid开发中Widget的生命周期实例分析

    Android开发中Widget的生命周期实例分析

    这篇文章主要介绍了Android开发中Widget的生命周期,结合实例形式分析了Android开发中Widget生命周期所涉及的常用方法与使用技巧,代码备有详尽的注释便于理解...

    lg87839850912232021-06-07