使用 ItemTouchHelper 在 recyclerView 中滑动到另一个视图

Posted

技术标签:

【中文标题】使用 ItemTouchHelper 在 recyclerView 中滑动到另一个视图【英文标题】:Swipe to another view in recyclerView with ItemTouchHelper 【发布时间】:2015-07-02 14:55:40 【问题描述】:

Given 是一个 RecyclerView。 在执行滑动时显示不同的视图的最佳做法和最简单的方法是什么?

Here 是一个类似的问题。但是使用该解决方案只能显示位图。

recyclerview 带来了很棒的ItemTouchHelper,它有回调:

 public void onChildDraw(Canvas canvas, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) ...

我的问题是:我能否以某种方式利用此回调在两个视图之间滑动,如果可以,如何。

谢谢。

【问题讨论】:

【参考方案1】:

我正在处理类似的任务 - 需要在项目滑开时显示隐藏的底层面板。 我已经设法在项目行视图的根 RelativeLayout 中有两个内部布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:fresco="http://schemas.android.com/apk/res-auto"
            xmlns:tools="http://schemas.android.com/tools"
            android:layout_
            android:layout_>

<RelativeLayout
    android:id="@+id/actionsLayout"
    android:layout_
    android:layout_
    android:layout_centerInParent="true">
    <TextView
        android:layout_
        android:layout_
        android:text="Hidden stuff is here"/>
</RelativeLayout>
<RelativeLayout android:id="@+id/itemLayout"
                android:layout_
                android:layout_
                android:layout_centerVertical="true"
                android:background="@color/submission_row_bg">

    <TextView
        android:layout_
        android:layout_
        android:text="Swiping stuff is here"/>

</RelativeLayout>

</RelativeLayout>

在您的 ItemViewHolder 类中,我有相应的字段:

public class ItemViewHolder extends RecyclerView.ViewHolder 

    RelativeLayout itemLayout;       
    RelativeLayout actionsLayout;

然后在 ItemTouchHelper.Callback 中,我将覆盖 onChildDraw 方法,如下所示:

public static class MyItemTouchCallback extends ItemTouchHelper.Callback 

    public void onChildDraw(Canvas c, RecyclerView recyclerView,
            RecyclerView.ViewHolder viewHolder, float dX, float dY,
            int actionState, boolean isCurrentlyActive) 

        if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) 
            //HERE IS THE TRICK
            ((ItemViewHolder) viewHolder).itemLayout.setTranslationX(dX);

         else 
            super.onChildDraw(c, recyclerView, viewHolder, dX, dY,
                    actionState, isCurrentlyActive);
        
    

它有助于滑开一个视图并显示底层视图。

【讨论】:

像魅力一样工作。

以上是关于使用 ItemTouchHelper 在 recyclerView 中滑动到另一个视图的主要内容,如果未能解决你的问题,请参考以下文章

[技术博客] 通过ItemTouchHelper实现侧滑删除功能

如何使用 ItemTouchHelper 及其 Callback 或实现自定义的?

使用 ItemTouchHelper 时如何在拖动时取消对 RecyclerView 中项目的拖动?

ItemTouchHelper - 在第一条跳线之后强制下降

android开发游记:ItemTouchHelper 使用RecyclerView打造可拖拽的GridView

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