iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Android开发中怎么在RecyclerView上添加一个滑动删除功能
  • 782
分享到

Android开发中怎么在RecyclerView上添加一个滑动删除功能

androidrecyclerviewrecycle 2023-05-31 08:05:04 782人浏览 独家记忆
摘要

Android开发中怎么在RecyclerView上添加一个滑动删除功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。首先更新item的布局(item_main

Android开发中怎么在RecyclerView上添加一个滑动删除功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

首先更新item的布局(item_main.xml):

<FrameLayout xmlns:android="Http://schemas.android.com/apk/res/android" android:id="@+id/item" android:layout_width="match_parent" android:layout_height="?listPreferredItemHeight" android:clickable="true" android:focusable="true" android:foreground="?selectableItemBackground"> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginLeft="16dp" android:textAppearance="?android:attr/textAppearanceMedium" /> <ImageView android:id="@+id/handle" android:layout_width="?listPreferredItemHeight" android:layout_height="match_parent" android:layout_gravity="center_vertical|right" android:scaleType="center" android:src="@drawable/ic_reorder_grey_500_24dp" /></FrameLayout>

用作"拖放手柄"的图片可以在Material Design Icon找到, 也可以方便地通过Android Material Design Icon Generator Plugin添加.

我们曾经提到过, 可以通过代码ItemTouchHelper.startDrag(RecyclerView.ViewHolder)来开启拖动. 所以我们要做的就是更新ViewHolder来包含新的手柄视图, 并设置一个简单的触摸事件接口, 以触发startDrag()方法.

我们需要定义一个接口来传递拖动事件.

public interface OnStartDragListener {  void onStartDrag(RecyclerView.ViewHolder viewHolder);}

然后, 在ItemViewHolder中实现化手柄视图.

public final ImageView handleView;public ItemViewHolder(View itemView) { super(itemView); // ... handleView = (ImageView) itemView.findViewById(R.id.handle);}

并且更新Adapter.

private final OnStartDragListener mDragStartListener;public RecyclerListAdapter(OnStartDragListener dragStartListener) { mDragStartListener = dragStartListener; // ...}@Overridepublic void onBindViewHolder(final ItemViewHolder holder,  int position) { // ... holder.handleView.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (MotionEventCompat.getActionMasked(event) ==   MotionEvent.ACTION_DOWN) { mDragStartListener.onStartDrag(holder); } return false; } });}

完整的Adapter应该看起来像这个.

剩下的是把OnStartDragListener添加到Fragment.

public class RecyclerListFragment extends Fragment implements  OnStartDragListener { // ... @Override public void onViewCreated(View view, Bundle icicle) { super.onViewCreated(view, icicle); RecyclerListAdapter a = new RecyclerListAdapter(this); // ... } @Override public void onStartDrag(RecyclerView.ViewHolder viewHolder) { mItemTouchHelper.startDrag(viewHolder); }}

但你运行之后, 可以看到这样的效果:

Android开发中怎么在RecyclerView上添加一个滑动删除功能

标示选中视图

在上一篇的基础示例中, 被拖拽的item事实上是被选中的, 但是没有可视化的标示. 由于显著的理由, 这是不受欢迎的, 但也很容易修复. 事实上, 在ItemTouchHelper的帮助下, 只要你的ViewHolder的itemView设置了background集合(selector), 就会得到相应的效果. 在Lollipop及之后的版本, item view的elevation在拖拽和滑动期间会增加. 而在之前的版本中, 滑动时会有fade效果. 看起来就像:

Android开发中怎么在RecyclerView上添加一个滑动删除功能

效果看起来不错, 但你可能想要更多的控制. 一种方法是, 无论任何时候ViewHolder被选中或者清空, 让item自己处理这种改变. 由此, ItemTouchHelper.Callback提供了两种回调.

onSelectedChanged(RecyclerView.ViewHolder, int). 每一次ViewHolder的状态, 变成drag(ACTION_STATE_DRAG)或者swipe(ACTION_STATE_SWIPE)时, 该方法就会被调用. 这时候是将ViewHolder的状态变成active的完美时刻.

clearView(RecyclerView, RecyclerView.ViewHolder). 在被拖拽的ViewHolder放下时, 或者是滑动操作取消或者完成时(ACTION_STATE_IDLE), 这里会是将ItemView状态设置为idle的最好的地方.

那么, 我们就把两者绑定在一起实现.

首先, 创建一个接口, 让目标ViewHolder实现:

public interface ItemTouchHelperViewHolder {  void onItemSelected();  void onItemClear();}

接着, 触发相应的回调方法:

@Overridepublic void onSelectedChanged(RecyclerView.ViewHolder viewHolder,  int actionState) { // We only want the active item if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) { if (viewHolder instanceof ItemTouchHelperViewHolder) { ItemTouchHelperViewHolder itemViewHolder =   (ItemTouchHelperViewHolder) viewHolder; itemViewHolder.onItemSelected(); } } super.onSelectedChanged(viewHolder, actionState);}@Overridepublic void clearView(RecyclerView recyclerView,  RecyclerView.ViewHolder viewHolder) { super.clearView(recyclerView, viewHolder); if (viewHolder instanceof ItemTouchHelperViewHolder) { ItemTouchHelperViewHolder itemViewHolder =  (ItemTouchHelperViewHolder) viewHolder; itemViewHolder.onItemClear(); }}

现在, 剩下的是让ItemViewHolder实现ItemTouchHelperViewHolder:

public class ItemViewHolder extends RecyclerView.ViewHolder  implements ItemTouchHelperViewHolder { // ... @Override public void onItemSelected() { itemView.setBackgroundColor(Color.LTGRAY); } @Override public void onItemClear() { itemView.setBackgroundColor(0); }}

考虑到这仅仅是一个示例, 我们仅仅是在item处于active状态时设置了灰色背景, 当item被清空时, 把灰色背景删除了. 如果你的Adapter和ItemTouchHelper紧密结对的话, 轻易地放弃这个设置也行, 转而可以直接在ItemTouchHelper.Callback转变item的状态.

Grid布局

如果你想在本项目中转而使用GridLayoutManager, 你会发现并没有正常地起作用. 原因以及修复原因都很简单: 必须告诉ItemTouchHelper我们想要支持左右拖拽. 在SimpleTouchHelperCallback中, 我们已经声明:

@Overridepublic int getMovementFlags(RecyclerView recyclerView,  RecyclerView.ViewHolder viewHolder) { int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN; int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END; return makeMovementFlags(dragFlags, swipeFlags);}

支持Grid布局所要求的唯一改变是dragFlags中添加左右方向:

int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN |  ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;

但是, 对于grid而言, "滑动删除"并不是一个天然的功能模式, 所以你也许会写一些如下的代码:

@Overridepublic int getMovementFlags(RecyclerView recyclerView,  RecyclerView.ViewHolder viewHolder) { int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN |   ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; int swipeFlags = 0; return makeMovementFlags(dragFlags, swipeFlags);}

Grid上面的上下左右"拖放"效果看起来如下:

Android开发中怎么在RecyclerView上添加一个滑动删除功能

自定义滑动动画

对我们而言, 在viewHolder拖拽和滑动的时候, ItemTouchHelper.Callback为我们提供了一个十分方便的方式来完全控制ViewHolder的动画. 因为ItemTouchHelper是一个ItemDecoration, 我们可以用类似的方式, 详细地了解视图的绘制(hook into the View drawing).

下面是一个简单的例子, 来覆盖默认的滑动动画, 来展示一个线性的fade效果.

@Overridepublic void onChildDraw(canvas c, RecyclerView recyclerView,  ViewHolder viewHolder, float dX, float dY,  int actionState, boolean isCurrentlyActive) { if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) { float width = (float) viewHolder.itemView.getWidth(); float alpha = 1.0f - Math.abs(dX) / width; viewHolder.itemView.setAlpha(alpha); viewHolder.itemView.setTranslationX(dX);  } else { super.onChildDraw(c, recyclerView, viewHolder, dX, dY,   actionState, isCurrentlyActive); }}

参数dX和dY代表选中视图的当前位置,

  • -1.0f表示完完全全的从ItemTouchHelper.END到ItemTouchHelper.START的滑动.

  • 0f表示完完全全的从ItemTouchHelper.START到ItemTouchHelper.END的滑动.

 对于任何没有处理的actionState你都可以调用super的方法, 从而使用默认的动画.

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网精选频道,感谢您对编程网的支持。

--结束END--

本文标题: Android开发中怎么在RecyclerView上添加一个滑动删除功能

本文链接: https://www.lsjlt.com/news/224482.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android开发中怎么在RecyclerView上添加一个滑动删除功能
    Android开发中怎么在RecyclerView上添加一个滑动删除功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。首先更新item的布局(item_main...
    99+
    2023-05-31
    android recyclerview recycle
  • Android开发中如何实现一个滑动删除功能
    这篇文章将为大家详细讲解有关Android开发中如何实现一个滑动删除功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。先看一下效果activity_lookstaff.xml<Rela...
    99+
    2023-05-31
    android 滑动删除 roi
  • 如何在Android中使用RecyclerView实现一个滑动删除
    本篇文章为大家展示了如何在Android中使用RecyclerView实现一个滑动删除,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。ItemTouchHelper.CallbackItemTouch...
    99+
    2023-05-31
    android recyclerview recycle
  • 怎么在android中利RecycleView添加一个下滑功能
    怎么在android中利RecycleView添加一个下滑功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。RecycleView内部有一个滑动监听的抽象类OnScroll...
    99+
    2023-05-31
    recycleview android recycle
  • 怎么在Android应用中添加一个长按删除弹功能
    今天就跟大家聊聊有关怎么在Android应用中添加一个长按删除弹功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。只需要调用该方法即可完成绑定:PopupList popu...
    99+
    2023-05-31
    android roi
  • Android一步步带你在RecyclerView上面实现"拖放"和"滑动删除"功能
    先给大家展示下大概效果图:Android上面有许多的教程, 库和示例, 在RecyclerView上面实现"拖放"和"滑动删除"功能. 尽管有更新, 更好的方法可用, 但是大多数人依然使用旧的View.OnDragListener和Roma...
    99+
    2023-05-31
    android recyclerview recycle
  • 怎么在Android中利用ListView实现一个侧滑删除功能
    本篇文章给大家分享的是有关怎么在Android中利用ListView实现一个侧滑删除功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。需求:listView可以侧滑item,展...
    99+
    2023-05-31
    android listview roi
  • 如何在Android中利用Recyclerview实现一个上拉加载功能
    如何在Android中利用Recyclerview实现一个上拉加载功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在项目中使用列表的下拉刷新和上拉加载更多是很常见的功能,下拉...
    99+
    2023-05-31
    android recyclerview recycle
  • 怎么在Android中利用RecyclerView实现一个快速滚动功能
    本篇文章给大家分享的是有关怎么在Android中利用RecyclerView实现一个快速滚动功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。首先,在 build.gradle...
    99+
    2023-05-30
    recyclerview android
  • 怎么在Android应用中添加一个分享功能
    这篇文章将为大家详细讲解有关怎么在Android应用中添加一个分享功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Android 分享功能的实现代码一个Activity中,取出设备上安装的...
    99+
    2023-05-31
    android roi
  • 怎么在Android中实现一个滑动退出Activity功能
    怎么在Android中实现一个滑动退出Activity功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。实现Android 滑动退出Activity的功能and...
    99+
    2023-05-30
    android activity roi
  • 怎么在android中使用View实现一个滑动删除效果
    这篇文章给大家介绍怎么在android中使用View实现一个滑动删除效果,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。实现功能可以向左滑动,右侧出现删除2、向左滑动如果删除出现一大半,松手打开删除,反之关闭删除3、应用...
    99+
    2023-05-31
    android view roi
  • 在android应用中怎么添加一个上拉刷新下拉加载功能
    在android应用中怎么添加一个上拉刷新下拉加载功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。下拉刷新首先我们给出如下几个参数,后面要用:  pr...
    99+
    2023-05-31
    android roi
  • 在Android项目中使用RecyclerView实现一个上拉加载更多功能
    在Android项目中使用RecyclerView实现一个上拉加载更多功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。既然有刷新的时候有两种状态就要定义两个状...
    99+
    2023-05-31
    android recyclerview recycle
  • 怎么在Android项目中添加 一个进度条功能
    怎么在Android项目中添加 一个进度条功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。效果如图… 代码实现过程–main布局 这个布局中就是一个简单的引用<...
    99+
    2023-05-31
    android roi 目中
  • 怎么在Android应用中添加一个倒计时功能
    怎么在Android应用中添加一个倒计时功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。SweepView.java:public class SweepView ext...
    99+
    2023-05-31
    android roi
  • Android开发中实现一个头像滑动变大变小功能
    这篇文章给大家介绍Android开发中实现一个头像滑动变大变小功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。实现通过监听ScrollView在Y轴的滑动距离,然后在代码中动态设置头像的位置和大小。public cl...
    99+
    2023-05-31
    android roi
  • 怎么在Android应用中添加一个添加物品动画
    这篇文章将为大家详细讲解有关怎么在Android应用中添加一个添加物品动画,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。开发环境:AndroidStudio2.1.2+gradle-2.10...
    99+
    2023-05-31
    android roi
  • Android开发中使用View实现一个垂直上拉下滑功能
    Android开发中使用View实现一个垂直上拉下滑功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。效果二、实现思路 这个效果其实有很多实现方法,为了让松手时...
    99+
    2023-05-31
    android view roi
  • 怎么在Android应用中添加一个文件管理功能
    这篇文章给大家介绍怎么在Android应用中添加一个文件管理功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。思路:获取存储器接口 遍历当前目录 利用ListView显示文件文件夹先是布局<&#63;xm...
    99+
    2023-05-31
    android roi
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作