所以我已经在recyclerview rv上实现了这个itemtouchhelper.simple回调。
现在在此rv中,根据内容类型,我在布局中将2种设置为一行。
所以当我在rv上设置此touchhelper时,即使我不想这样做,也正在这两种布局上实现。我只想将该划动应用于该布局的一种。
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子项的行上执行滑动操作,否则,我不想执行滑动操作。
有什么方法可以删除此另一个子messageholder_to上的滑动动画和侦听器。
我的应用根据消息ID显示to_layout或from_layout。
感谢任何帮助。
答案 0 :(得分:2)
在ItemTouchHelper.SimpleCallback
内,重写getSwipeDirs()
方法,并为要禁用滑动的任何行返回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)
答案 1 :(得分:1)
int makeMovementFlags (int dragFlags,int swipeFlags)负责每一行的移动,滑动或拖动。
摘自文档:
创建运动标记的便捷方法。
例如,如果要拖放项目 垂直向左滑动即可解除,您可以调用此方法 使用:makeMovementFlags(UP | DOWN,LEFT);
实施getMovementFlags()方法,并返回makeMovementFlags(0, 0);
,您不想为其添加滑动或拖动的行或视图。
示例代码:
@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);
}