如何有选择性地设置ItemTouchHelper的滑动?

3

我已经在 RecyclerView (rv) 上实现了 ItemTouchHelper.SimpleCallback。现在,在这个 rv 中,我设置了两种不同类型的布局作为一行,具体取决于内容类型。

但是,当我把这个 touchhelper 设置到 rv 上时,它被应用到了这两种布局上,尽管我并不想这样做。我只想将 swipe 应用于其中一种布局。

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。

感谢任何形式的帮助。

2个回答

8
在你的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)

2

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接