【问题标题】:Advanced RecyclerView library - code examples高级 RecyclerView 库 - 代码示例
【发布时间】:2016-07-08 03:41:47
【问题描述】:

https://github.com/h6ah4i/android-advancedrecyclerview

就它提供的功能而言,这似乎是一个很棒的库。但是,它缺乏良好的文档。它在Swipeable 项目上有一个“教程”,但像其他一些人一样,我无法遵循它。

有没有人有一个可行的例子,或者任何人都可以使用这个库制作一个简单的用例来滑动一个项目并在它下面显示一个按钮?对于很多对此功能感兴趣的人来说,它会很有用。

【问题讨论】:

  • 将依赖项添加到项目后,我找不到任何文档。它很好地说明了使用示例应用程序可以做什么,但是在使用它时……我迷路了。希望你能找到更了解这个库的人,我将尝试替代方案:/
  • an alternative 有更好的文档。
  • 哇,我想这可能是我的问题和愿望的答案!似乎也有很多记录,但我还没有看。非常感谢。如果您愿意,请将您的评论作为答案。
  • 如果滑动或拖动是您想要的,您可以使用 ItemTouchHelper 和 RecyclerView 轻松实现它,而无需添加库作为依赖项,请参阅此处获取教程:medium.com/@ipaulpro/… 然后到目前为止作为下面的按钮,您只需将滑动动画限制为足够远以暴露您的按钮并处理它的点击。上述教程的第二部分包含自定义滑动动画的部分medium.com/@ipaulpro/…

标签: android button android-recyclerview swipe dismiss


【解决方案1】:

您可以在主网站上找到更详细的文档: https://advancedrecyclerview.h6ah4i.com

以下内容是从文档中的swipeable 页面复制而来的:


步骤 1. 使适配器支持稳定的 ID

这一步非常重要。如果适配器没有返回稳定且唯一的 ID,则会导致一些奇怪的行为(错误的动画、NPE 等......)

class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
    MyAdapter() {
        setHasStableIds(true);
    }

    @Override
    public long getItemId(int position) {
        // requires static value, it means need to keep the same value
        // even if the item position has been changed.
        return mItems.get(position).getId();
    }
}

步骤 2. 修改项目视图的布局文件

用另一个FrameLayout 包装内容视图,该@+id/container ID 为。

<!-- for itemView -->
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="56dp">
    <!-- Content View(s) -->
    <TextView
        android:id="@android:id/text1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"/>
</FrameLayout>

⏬⏬⏬

<!-- for itemView -->
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="56dp">

    <!-- for getSwipeableContainerView() -->
    <FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <!-- Content View(s) -->
        <TextView
            android:id="@android:id/text1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"/>

    </FrameLayout>
</FrameLayout>

第三步,修改ViewHolder

  1. 将父类更改为AbstractSwipeableItemViewHolder
  2. 实现getSwipeableContainerView() 方法。

注意:AbstractSwipeableItemViewHolder 类是一个便利类,它实现了 `SwipeableItemViewHolder 的样板方法。

class MyAdapter ... {
    static class MyViewHolder extends RecyclerView.ViewHolder {
        TextView textView;
        MyViewHolder(View v) {
            super(v);
            textView = (TextView) v.findViewById(android.R.id.text1);
        }
    }
    ...
}

⏬⏬⏬

class MyAdapter ... {
    static class MyViewHolder extends AbstractSwipeableItemViewHolder {
        TextView textView;
        FrameLayout containerView;

        public MyViewHolder(View v) {
            super(v);
            textView = (TextView) v.findViewById(android.R.id.text1);
            containerView = (FrameLayout) v.findViewById(R.id.container);
        }

        @Override
        public View getSwipeableContainerView() {
            return containerView;
        }
    }
}

第四步:实现SwipeableItemAdapter接口

class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
    ...
}

⏬⏬⏬

class MyAdapter
        extends RecyclerView.Adapter<MyAdapter.MyViewHolder>
        implements SwipeableItemAdapter<MyAdapter.MyViewHolder> {

    @Override
    public int onGetSwipeReactionType(MyViewHolder holder, int position, int x, int y) {
        // Make swipeable to LEFT direction
        return Swipeable.REACTION_CAN_SWIPE_LEFT;
    }

    @Override
    public void onSetSwipeBackground(MyViewHolder holder, int position, int type) {
        // You can set background color/resource to holder.itemView.

        // The argument "type" can be one of the followings;
        // - Swipeable.DRAWABLE_SWIPE_NEUTRAL_BACKGROUND
        // - Swipeable.DRAWABLE_SWIPE_LEFT_BACKGROUND
        // (- Swipeable.DRAWABLE_SWIPE_UP_BACKGROUND)
        // (- Swipeable.DRAWABLE_SWIPE_RIGHT_BACKGROUND)
        // (- Swipeable.DRAWABLE_SWIPE_DOWN_BACKGROUND)

        if (type == Swipeable.DRAWABLE_SWIPE_LEFT_BACKGROUND) {
            holder.itemView.setBackgroundColor(Color.YELLOW);
        } else {
            holder.itemView.setBackgroundColor(Color.TRANSPARENT);
        }
    }

    @Override
    public SwipeResultAction onSwipeItem(MyViewHolder holder, int position, int result) {
        // Return sub class of the SwipeResultAction.
        //
        // Available base (abstract) classes are;
        // - SwipeResultActionDefault
        // - SwipeResultActionMoveToSwipedDirection
        // - SwipeResultActionRemoveItem
        // - SwipeResultActionDoNothing

        // The argument "result" can be one of the followings;
        // 
        // - Swipeable.RESULT_CANCELED
        // - Swipeable.RESULT_SWIPED_LEFT
        // (- Swipeable.RESULT_SWIPED_UP)
        // (- Swipeable.RESULT_SWIPED_RIGHT)
        // (- Swipeable.RESULT_SWIPED_DOWN)

        if (result == Swipeable.RESULT_LEFT) {
            return new SwipeResultActionMoveToSwipedDirection() {
                // Optionally, you can override these three methods
                // - void onPerformAction()
                // - void onSlideAnimationEnd()
                // - void onCleanUp()
            };
        } else {
            return new SwipeResultActionDoNothing();
        }
    }
}

第五步,修改RecyclerView的初始化流程

在您的Activity / Fragment 中添加一些额外的初始化过程。

  1. 实例化RecyclerViewSwipeManager
  2. 创建一个包装好的适配器并将其设置为RecyclerView
  3. RecyclerView 附加到RecyclerViewSwipeManager

void onCreate() {
    ...

    RecyclerView recyclerView = findViewById(R.id.recyclerView);
    MyAdapter adapter = new MyAdapter();

    recyclerView.setAdapter(adapter);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
}

⏬⏬⏬

void onCreate() {
    ...

    RecyclerView recyclerView = findViewById(R.id.recyclerView);
    RecyclerViewSwipeManager swipeManager = new RecyclerViewSwipeManager();

    MyAdapter adapter = new MyAdapter();
    RecyclerView.Adapter wrappedAdapter = swipeManager.createWrappedAdapter(adapter);

    recyclerView.setAdapter(wrappedAdapter);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));

    // disable change animations
    ((SimpleItemAnimator) mRecyclerView.getItemAnimator()).setSupportsChangeAnimations(false);

    swipeManager.attachRecyclerView(recyclerView);
}

希望我的回答对你有帮助。

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
  • @Dev-iL 您现在可以更改评论吗?
  • 嗨@Zacktamondo,我不确定你的意思 - 评论指的是帖子的以前版本,所以遇到它的每个人都会看到帖子被编辑之后 - 这是审查评论的预期结果。我没有给你一个-1,不管怎样,看看你是一个新用户,你的行为在SO上受到鼓励(即通过编辑你的帖子来回复评论)——你可以得到我的+1 :)
  • @Dev-iL 谢谢你建议我删除并重新发布答案吗?
  • 请不要那样做。您对此答案的评分为 +1/-1,这意味着您获得了净正的代表增益。删除答案只会伤害您,但更重要的是 - 在本网站上转发相同的内容是不受欢迎的。
【解决方案2】:

我发现该库文档齐全且易于使用。

我从原始示例中挑选了代码,该代码是实现带有下方按钮的滑动所需的代码,可以在 here 找到。

希望以下提示将使您更容易理解实施示例的模式。

概述

LauncherPageFragment 中的createAdapter 方法 概述哪些活动包含哪些功能

每个样本都遵循两种模式中的任何一种:

基本示例
在基本示例的情况下,回收器视图所需的适配器和视图持有者定义在同一个活动类中。

复杂样本
在复杂样本的情况下,适配器和视图保持器是单独创建的,而回收器视图本身是在另一个片段中定义的。
在这种情况下,会在活动中添加一个附加片段。这些存在于com.h6ah4i.android.example.advrecyclerview.common.fragment 包中,用于提供需要在回收站视图中显示的数据。

对于需要创建的滑动按钮 RecyclerViewTouchActionGuardManager(在滑动关闭动画运行时抑制滚动)和RecyclerViewSwipeManager 创建一个包装的适配器。

对于adapater,您需要实现SwipeableItemAdapter 接口并且视图持有者需要扩展AbstractSwipeableItemViewHolder 而不是RecyclerView.ViewHolder。

注意: 我改变了onSetSwipeBackground 的实现 在原始示例中,它在 itemview 上设置了一些背景。
如果要显示下面的视图,则不需要这样做。这也导致了不必要的重绘。

【讨论】:

    猜你喜欢
    • 2020-08-21
    • 2010-12-10
    • 1970-01-01
    • 2011-01-31
    • 2018-03-30
    • 2018-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多