如何使用 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 值覆盖 onChildDrawonChildDrawOver 方法。

另请参阅 getDefaultUIUtilItemTouchUIUtil 的实现(这是 onChildDrawonChildDrawOver 调用的内容)。 getDefaultUIUtil 的注释演示了如何将它与覆盖 onChildDrawonChildDrawOver 结合使用(即使示例错误地返回一个 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

Android开发 RecyclerView实现拖动与滑动ItemTouchHelper

Android开发 RecyclerView实现拖动与滑动ItemTouchHelper