如何使用 ItemTouchHelper 及其 Callback 或实现自定义的?
Posted
技术标签:
【中文标题】如何使用 ItemTouchHelper 及其 Callback 或实现自定义的?【英文标题】:How to use ItemTouchHelper and its Callback or implement customized ones? 【发布时间】:2015-08-27 00:09:06 【问题描述】:我注意到了这些库,并渴望在我的应用程序中使用它们。
我的RecyclerView
使用StaggeredGridLayoutManager
来组织viewHolders
,我写下了以下代码:
ItemTouchHelper helper = new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(
ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.START | ItemTouchHelper.END,
ItemTouchHelper.START | ItemTouchHelper.END)
@Override
public boolean onMove(RecyclerView recyclerView,
RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target)
mAdapter.move(viewHolder.getAdapterPosition(), target.getAdapterPosition());
return true;
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction)
mAdapter.remove(viewHolder.getAdapterPosition());
);
helper.attachToRecyclerView(mRecyclerView);
有两个问题:
滑动项目不会将其alpha
更改为deltaX
。
假设RecyclerView
中有 3 个项目(有 2 列):
如果我将第三个移动到第一个位置,向下滚动RecyclerView
(其他项目不会影响前三个)然后向上滚动,第二个和第三个将完全相同。
看来我应该写一个自定义的ItemTouchHelper
添加alpha
动画来解决第一个问题,而我没有正确使用这些类,从而导致了第二个问题。
因此,使用ItemTouchHelper
的最佳样本是什么?或者如何实现一个定制的?提前感谢任何答案或 cmets。
【问题讨论】:
谷歌搜索让我得到了这个答案:***.com/a/30644208/1326147 正在使用的地方。 @Armfoot 很抱歉之前没有展示我真正需要的东西。我之前读过那个答案,并且知道如何为 ItemTouchHelper 使用 SimpleCallback。不过,其实我很想知道如何实现一个自定义的ItemTouchHelper及其Callback。再次抱歉。 没问题,然后请编辑您的问题(标题和正文),确切地说是“如何实现自定义的 ItemTouchHelper 及其回调:如果您表明您已经对该主题进行了一些研究,那么更多的人可能会有所帮助并尝试自己做点什么。 @Armfoot 感谢您的建议,我改进了我的问题。现在清楚了吗?我没有足够的声誉来展示任何图片,因此我尽可能准确地描述了我的问题。 您的问题现在很清楚,特别是您提供的示例将帮助更好,做得很好! (升级) 【参考方案1】:根据 ItemTouchHelper.Callback
中的 cmets,您希望为那些 dX、dY 值覆盖 onChildDraw
或 onChildDrawOver
方法。
另请参阅 getDefaultUIUtil
和 ItemTouchUIUtil
的实现(这是 onChildDraw
和 onChildDrawOver
调用的内容)。 getDefaultUIUtil
的注释演示了如何将它与覆盖 onChildDraw
和 onChildDrawOver
结合使用(即使示例错误地返回一个 bool 值以进行处理)。
如果您想在 Lollipop 的默认高度上添加 5,这里有一个简单的示例:
@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive)
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
if (Build.VERSION.SDK_INT >= 21 && isCurrentlyActive && !isElevated)
final float newElevation = 5f + ViewCompat.getElevation(viewHolder.itemView);
ViewCompat.setElevation(viewHolder.itemView, newElevation);
isElevated = true;
@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder)
super.clearView(recyclerView, viewHolder);
isElevated = false;
【讨论】:
Lollipop 的 ItemTouchUIUtil 已经做到了,但不知何故,没有绘制阴影 :(以上是关于如何使用 ItemTouchHelper 及其 Callback 或实现自定义的?的主要内容,如果未能解决你的问题,请参考以下文章
在哪里为与 RecyclerView 一起使用的 ItemTouchHelper 编写回调函数
如何在具有用于滑动的 ItemTouchHelper 的 RecyclerView 中使 TextView 可滚动?
ItemTouchHelper - 在第一条跳线之后强制下降
android开发游记:ItemTouchHelper 使用RecyclerView打造可拖拽的GridView