https://github.com/h6ah4i/android-advancedrecyclerview
就其提供的功能而言,这似乎是一个很棒的库。但是,它缺乏良好的文档。它在Swipeable
项目上有一个“教程”,但和其他人一样,我无法遵循它。
有没有人有一个工作示例,或者任何人都可以使用此库制作一个简单的用例来刷一个项目并在其下面显示一个按钮?对于许多对此功能感兴趣的人来说,它会很有用。
答案 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
AbstractSwipeableItemViewHolder
。getSwipeableContainerView()
方法。注意:
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
。
RecyclerViewSwipeManager
。RecyclerView
。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);
}
我希望我的回答会有所帮助。
答案 1 :(得分:1)
我发现图书馆记录良好且易于使用。
我已经从原始样本中选择了实现滑动所需的代码,其下方的按钮可以找到here。
希望以下提示可以让您更容易理解实施样本的模式。
<强>概述强>
LauncherPageFragment中的 createAdapter
方法
概述了哪个活动包含哪个功能
每个样本都遵循以下两种模式之一:
基本样本
在基本样本的情况下,回收器视图所需的适配器和视图支架在同一活动类中定义。
复杂样本
在复杂样本的情况下,适配器和视图保持器是单独创建的,并且回收器视图本身在另一个片段中定义
在这种情况下,存在额外的片段,其在活性中添加。它们存在于com.h6ah4i.android.example.advrecyclerview.common.fragment
包中,用于提供需要在回收站视图中显示的数据。
要使用按钮滑动,您需要创建
RecyclerViewTouchActionGuardManager
(禁止在滑动消除动画运行时滚动)和RecyclerViewSwipeManager
创建包装适配器。
对于适配器,您需要实现SwipeableItemAdapter
接口和查看持有者需要扩展AbstractSwipeableItemViewHolder
而不是RecyclerView.ViewHolder。
注意:强>
我更改了onSetSwipeBackground
的实施
在原始样本中,它在itemview上设置了一些背景
如果要显示下面的视图,则不需要这样做。它也造成了不必要的重绘。