问题标签 [itemtouchhelper]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
437 浏览

android - 具有多种视图类型和 ItemTouchHelper 的 Android RecyclerView

我正在尝试让 ItemTouchHelper 与具有多种视图类型的 RecyclerView 一起使用。我已经看到一些答案说,为了让它工作,recyclerView 适配器必须有 setHasStableIds(true) 和 overrider getItemId(int position) - 确保你的项目有稳定的ID。但是,我似乎无法让它工作,并且似乎找不到任何实际的实现示例。

任何人都可以提供或指出使用 ItemTouchHelper 和多种视图类型的工作示例吗?

0 投票
1 回答
2087 浏览

java - 如何正确使用 ItemTouchHelper

我正在尝试将RecyclerViewwithItemTouchHelper用于基本的“拖放”和“滑动关闭”实现。滑动正常,适配器中的项目正确删除,动画正确,但“拖放”行为非常奇怪。长按后视图没有移动,但是适配器中的交换项目是正确的。

这就是它在我的 RecyclerView 中的工作方式

这就是我想要的

我的演示者中的这段代码,onSelectedChanged 和 clearView 只是为了清楚地演示如何选择项目。

我的适配器中的这个方法

0 投票
0 回答
902 浏览

android - 如何在 Android recyclerView 中将多个项目拖到一起?

我正在使用 simpleItemTouchHelper 在 recyclerview 中启用拖放功能。它运作良好。但我想通过拖动一个项目来拖动多个项目(特定数量-> eg.3 或 4)。在我的项目中,当我选择并拖动标题项时,我还想移动它的另一个子项。

我怎样才能做到这一点?

这是我的代码:

活动

适配器:

接口在这里:

0 投票
1 回答
2265 浏览

android - 如何在 RecyclerView 中执行拖动和删除项目功能

我能够在列表中实现拖放项目并重新排序。我需要做的是实现一个删除功能,可以选择并按住一个项目并将其拖到垃圾桶图标。一旦它与垃圾桶图标重叠,后者的颜色将从灰色变为红色。一旦用户释放该项目,将出现一个确认模式。 在此处输入图像描述

从演示中,您可以看到将列表中的前三个项目拖向垃圾桶图标并没有将垃圾桶图标变为红色,而是启动了模式。第四个项目确实改变了垃圾桶图标的颜色,但它在没有确认的情况下立即从列表中删除。

拖放是使用以下方法实现的ItemTouchHelperCallback

如您所见,它onSelectedChanged设置了垃圾桶图标的颜色并调用该方法来启动确认模式。我不确定我是否将方法放置在正确的位置。在我的适配器中,我使用以下方法从列表中删除该项目:

启动确认模式的方法调用上述方法。它也位于我的适配器中:

基本上,我想要的是类似于 Android 操作系统的东西,用户将应用程序拖到卸载图标,将图标的颜色更改为红色,并在应用程序发布后将其删除。

0 投票
2 回答
555 浏览

android - RecyclerView 项目删除行为异常

我正在使用本教程为我的 RecyclerView 构建一个 itemTouchListener。recyclerview 中的项目比屏幕显示的要多(超过 10 个),因此回收开始行动。itemtouchHelper 处理上下和左右移动。经过 2 天的挣扎(将 setStableIds 设置为 true,这会在上下移动时导致查看器视图闪烁),我终于得到了更好的行为。我的关键功能代码:

问题是这样的。尽管 recyclerview 运行平稳,项目很好地改变了位置,但是当一个项目被滑开时,有时当 recyclerview 向下滚动时另一个项目看起来也被删除了(所以看起来被删除的另一个项目填充了相同的“屏幕”位置滚动后在回收站视图中)。它不会每次都发生,它主要发生在某些特定位置的视图被滑动时。如果我向上或向下移动邻居视图,则可以弥补“差距”。

抱歉,在我第二次删除视图并向下滚动后,您必须稍等片刻才能看到发生的事情

我已经尝试了在这里找到的所有解决方案(notifyDataChanged、notifyItemRangeChanged(每个参数组合)。但是没有什么能让我有一个稳定的行为。在大量的stackoverflow搜索之后,我决定遵循 holder.setIsRecyclable(false) 即使我不想的建议这样做(因为它毕竟消除了拥有recyclerview的意义)。但在这种情况下,会出现其他问题。你会在下面看到当大部分视图被刷掉时,它们较低的视图不会离开屏幕,即使他们显然已经“离开了适配器”(不能将它们刷掉)。最后,最后一个视图仍然卡住了。

您也必须在这里稍等片刻,最后您会看到卡住的视图

我已经在一个全新的项目中测试了这两种方式,没有任何外部影响。我曾尝试放入notifyDataChanged()clearView 的覆盖功能。似乎没有什么能提供一个坚如磐石的稳定回收者视图,它本身不会在某个时候出现差距。

现在的问题是:有没有办法让回收工作的回收工作表现得像它应该表现的那样,还是我应该接受这种情况?非常感谢您的关注!

更新 1---------------------------------------- 正如我被告知可能存在问题,thisviewholder.itemView.setAlpha(1);我将其与相应的覆盖一起注释掉onChildDraw(它的整体),用于在滑出视图时淡出视图。所以现在什么都看不见了。问题仍然存在。

更新 2---------------------------- 我已强制执行 stableIds(已经执行过一次但没有成功)

和适配器构造器

问题仍然存在。

更新 3---------------------------- 我最终使用了不同的教程,现在一切都按预期工作。非常感谢!

0 投票
0 回答
669 浏览

java - RecyclerView 拖放不适用于多种视图类型

我正在尝试使用带有垂直 LinearLayoutManager 的 RecyclerView 来显示列表项。此列表可以包含几种不同的项目类型(不同的布局),并且可以由用户使用拖放重新排序。

对于项目类型,如 Android 文档中所述,我重写了getItemType方法,以便在回收器中处理不同类型的视图,并在 onCreateViewHolder 和 onBindViewHolder 中处理它。这就像一个魅力。

对于拖放重新排序,我使用了ItemTouchHelper.Callback (受此示例项目的启发)。这也很有效。

当我尝试使用不同的项目类型和拖放行为时,就会出现问题。只要拖动发生在相同类型的项目之间,这效果很好,但是当我将 A 类型的视图拖动到 B 类型的视图上时,拖动停止并且视图返回到它的原始位置。

这是我的代码:

MyFragment.java

MyDragHelperCallback.java

MyDragListener.java

我的适配器.java

有什么我想念的吗?或者这仅仅是可能实现的?

感谢您的所有回答!

0 投票
2 回答
190 浏览

android - 如何在刷过的 RecyclerView 项目下显示自定义布局?

我想在刷完RecyclerView 项目后在背景上获得我的自定义布局。我找到了一个解决方案,它可以带来很多链接。但是我在使用它时遇到了问题。

参考解决方案 - https://stackoverflow.com/a/35667044/8013212

如果您执行与示例中完全相同的操作,则一切正常。但在示例中clipBackground,左侧对齐,我需要居中。任何更改对齐方式的尝试都会clipBackground导致它停止显示。请告诉我如何对齐clipBackground中心?

0 投票
1 回答
843 浏览

android - 在 RecyclerView 中滑动(图标大小)

滑动项目时,背景会被另一种颜色着色,并显示一个图标。一切都很好,但我不喜欢图标根据项目的高度改变大小的事实。请告诉我如何使图标始终保持相同大小

我使用此代码绘制背景和图标。

0 投票
1 回答
4417 浏览

android - 达到一定距离后如何停止在回收站视图中滑动项目

我在 android 中有一个回收站视图。我已经附上了ItemTouchHelper它。我只启用了从左到右的滑动。

因此,当我滑动 Recycler 视图的任何项目时,该项目开始向右移动,并在左侧绘制文本。这可以 。我的要求是,我希望只允许用户滑动到某个距离,当达到该距离并且用户释放触摸时,被滑动的项目应该回到它向左的位置。

问题是,当我从左向右滑动时,视图会完全滑出屏幕。我怎样才能限制它只能刷到一段距离?我该怎么做 ?

这是我的项目触摸回调代码:

0 投票
2 回答
845 浏览

java - 使用 ItemTouchHelper 在 RecyclerView 中的悬停事件

我有一个使用andRecyclerView实现的拖放功能。ItemTouchHelperItemTouchHelper.Callback

ItemTouchHelper.Callback我有一个回调方法onMove(),在拖动视图被拖动到目标视图上并完成交换后调用该方法。

我试图实现(或查找)的是一个新的回调,当拖动的视图位于目标视图上方时,在进行交换之前调用该回调。正如您在下面的 GIF 中看到的那样。

在此处输入图像描述

有什么想法可以实现这一目标吗?谢谢!