高级RecyclerView库 - 代码示例

时间:2016-03-21 14:50:31

标签: android button android-recyclerview swipe dismiss

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

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

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

2 个答案:

答案 0 :(得分:2)

您可以在主网站上找到更详细的文档: 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 whitch包含内容视图,其中包含@+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>

步骤3.修改ViewHolder

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

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

    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;
            }
        }
    }
    

    步骤4.实施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();
            }
        }
    }
    

    步骤5.修改RecyclerView

    的初始化过程

    Activity / Fragment

    中添加一些额外的初始化过程
    1. 实例化RecyclerViewSwipeManager
    2. 创建一个包装的适配器并将其设置为RecyclerView
    3. RecyclerView附加到RecyclerViewSwipeManager
    4. 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);
      }
      

      我希望我的回答会有所帮助。

答案 1 :(得分:1)

我发现图书馆记录良好且易于使用。

我已经从原始样本中选择了实现滑动所需的代码,其下方的按钮可以找到here

希望以下提示可以让您更容易理解实施样本的模式。

<强>概述

LauncherPageFragment中的

createAdapter方法 概述了哪个活动包含哪个功能

每个样本都遵循以下两种模式之一:

基本样本
在基本样本的情况下,回收器视图所需的适配器和视图支架在同一活动类中定义。

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

要使用按钮滑动,您需要创建 RecyclerViewTouchActionGuardManager(禁止在滑动消除动画运行时滚动)和RecyclerViewSwipeManager创建包装适配器。

对于适配器,您需要实现SwipeableItemAdapter接口和查看持有者需要扩展AbstractSwipeableItemViewHolder而不是RecyclerView.ViewHolder。

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