高级RecyclerView库 – 代码示例

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

这似乎是一个伟大的图书馆,它提供了什么function。 但是,它缺乏良好的文档。 它有一个关于Swipeable项目的“教程”,但像其他人一样,我不能遵循它。

有没有人有一个工作的例子,或任何人都可以做一个简单的用例刷卡项目,并显示下使用这个库的button? 这对于许多对此function感兴趣的人来说是有用的。

我发现图书馆是有据可查的,易于使用。

我从原始样本中挑选了代码,用于实现用下面的button实现刷卡。

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

概观

LauncherPageFragment中的 createAdapter方法概述了哪个活动包含哪个function

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

基本样本
在基本样本的情况下,回收站视图所需的适配器和视图持有人在相同的活动等级中定义。

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

对于button的滑动,您需要创buildRecyclerViewTouchActionGuardManager (在滑动 – 消除animation运行时禁止滚动),并使用RecyclerViewSwipeManager创build一个包装的适配器。

对于adapater,你将需要提示SwipeableItemAdapter接口和视图持有者需要扩展AbstractSwipeableItemViewHolder而不是RecyclerView.ViewHolder。

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

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

并从文档中的可滑动页面复制以下内容:


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

这一步非常重要。 如果适配器不返回稳定和唯一的ID,这将导致一些奇怪的行为(错误的animation,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.修改项目视图的布局文件

将内容视图与另一个具有@+id/container ID的FrameLayout结合在一起。

 <!-- 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()方法。

注意: 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; } } } 

第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. 创build一个包装的适配器并将其设置为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); } 

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