如何有选择地设置itemTouchHelper滑动?
how to set itemTouchHelper swipe selectively?
所以我在 recyclerview rv 上实现了这个 itemtouchhelper.simple 回调。
现在在这个 rv 中,我根据内容类型将 2 种布局设置为一行。
所以当我在 rv 上设置这个 touchhelper 时,它正在这两种布局上实现,即使我不想这样做 that.i 只想将滑动应用到这种布局的一种类型.
ItemTouchHelper.SimpleCallback ith = new ItemTouchHelper.SimpleCallback(0,ItemTouchHelper.RIGHT) {
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder viewHolder1) {
return false;
}
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
if(viewHolder.itemView.findViewById(R.id.messageholder_from) != null)
{
Log.d("texts", "onSwiped: "+viewHolder.itemView.findViewById(R.id.messageholder_from).findViewById(R.id.crfrom));
}
adapter.notifyDataSetChanged();
}
};
new ItemTouchHelper(ith).attachToRecyclerView(rv);
如您所见,我只想在其中包含此 messageholder_from child 的行上实现滑动,否则我不想实现滑动。
有什么方法可以删除另一个 child messageholder_to.
上的滑动动画和侦听器
我的应用根据消息 ID 显示 to_layout 或 from_layout。
感谢您的帮助。
在您的 ItemTouchHelper.SimpleCallback
中,覆盖 getSwipeDirs()
方法和 return 0 用于您想要禁用滑动的任何行。
@Override
public int getSwipeDirs(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
if (viewHolder.itemView.findViewById(R.id.messageholder_from) == null) {
return 0;
}
return super.getSwipeDirs(recyclerView, viewHolder);
}
具体取决于您的应用设置方式,可能有更好的方法来检测 viewHolder
是否是您想要禁止滑动的类型。例如,也许你可以
if (viewHolder instanceof WrongKindOfViewHolder)
或
if (viewHolder.isNotSwipeable)
int makeMovementFlags (int dragFlags,int swipeFlags) 负责每一行的移动、滑动或拖动。
来自文档:
Convenience method to create movement flags.
For instance, if you want to let your items be drag & dropped
vertically and swiped left to be dismissed, you can call this method
with: makeMovementFlags(UP | DOWN, LEFT);
使用 makeMovementFlags(0, 0);
实施 getMovementFlags() 方法和 return 您不想为其添加滑动或拖动的行或查看器。
示例代码:
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
int dragFlags = 0;
int swipeFlags = 0;
if (recyclerView.getLayoutManager().getClass() == LinearLayoutManager.class ) {
LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
int orientation = linearLayoutManager.getOrientation();
if (orientation == LinearLayoutManager.VERTICAL) {
swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
}else {
// horizontal
dragFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
// no swipe for horizontal layout
swipeFlags = 0;
}
}
if (viewHolder.getAdapterPosition() == 3) {
// disable swipe feature for position 3
return makeMovementFlags(0, 0);
}
return makeMovementFlags(dragFlags, swipeFlags);
}
所以我在 recyclerview rv 上实现了这个 itemtouchhelper.simple 回调。
现在在这个 rv 中,我根据内容类型将 2 种布局设置为一行。
所以当我在 rv 上设置这个 touchhelper 时,它正在这两种布局上实现,即使我不想这样做 that.i 只想将滑动应用到这种布局的一种类型.
ItemTouchHelper.SimpleCallback ith = new ItemTouchHelper.SimpleCallback(0,ItemTouchHelper.RIGHT) {
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder viewHolder1) {
return false;
}
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
if(viewHolder.itemView.findViewById(R.id.messageholder_from) != null)
{
Log.d("texts", "onSwiped: "+viewHolder.itemView.findViewById(R.id.messageholder_from).findViewById(R.id.crfrom));
}
adapter.notifyDataSetChanged();
}
};
new ItemTouchHelper(ith).attachToRecyclerView(rv);
如您所见,我只想在其中包含此 messageholder_from child 的行上实现滑动,否则我不想实现滑动。
有什么方法可以删除另一个 child messageholder_to.
上的滑动动画和侦听器我的应用根据消息 ID 显示 to_layout 或 from_layout。
感谢您的帮助。
在您的 ItemTouchHelper.SimpleCallback
中,覆盖 getSwipeDirs()
方法和 return 0 用于您想要禁用滑动的任何行。
@Override
public int getSwipeDirs(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
if (viewHolder.itemView.findViewById(R.id.messageholder_from) == null) {
return 0;
}
return super.getSwipeDirs(recyclerView, viewHolder);
}
具体取决于您的应用设置方式,可能有更好的方法来检测 viewHolder
是否是您想要禁止滑动的类型。例如,也许你可以
if (viewHolder instanceof WrongKindOfViewHolder)
或
if (viewHolder.isNotSwipeable)
int makeMovementFlags (int dragFlags,int swipeFlags) 负责每一行的移动、滑动或拖动。
来自文档:
Convenience method to create movement flags.
For instance, if you want to let your items be drag & dropped vertically and swiped left to be dismissed, you can call this method with: makeMovementFlags(UP | DOWN, LEFT);
使用 makeMovementFlags(0, 0);
实施 getMovementFlags() 方法和 return 您不想为其添加滑动或拖动的行或查看器。
示例代码:
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
int dragFlags = 0;
int swipeFlags = 0;
if (recyclerView.getLayoutManager().getClass() == LinearLayoutManager.class ) {
LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
int orientation = linearLayoutManager.getOrientation();
if (orientation == LinearLayoutManager.VERTICAL) {
swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
}else {
// horizontal
dragFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
// no swipe for horizontal layout
swipeFlags = 0;
}
}
if (viewHolder.getAdapterPosition() == 3) {
// disable swipe feature for position 3
return makeMovementFlags(0, 0);
}
return makeMovementFlags(dragFlags, swipeFlags);
}