除了长按以外,如何开始在RecyclerView中拖动项目?

时间:2019-05-27 16:58:28

标签: java android android-recyclerview android-databinding

我的Android应用程序具有多个RecyclerViews,用户需要重新排列其项目。每个项目都包含一个“重新排序控件”,当按下该控件时,必须开始拖动该项目。 (相当于iOS表格视图单元格中的“重新排序商品”)。长按不应该开始拖动。我的应用程序使用数据绑定。

我发现了几个使用ItemTouchHelper启用RecyclerView拖放的示例。所有这些示例均使用标准的长按开始拖动。下面的代码显示了BindingAdapter,它可以在大多数示例中使用拖放功能:

    @BindingAdapter(value = {"draggable"})
    public static void bindRecyclerViewDraggable(RecyclerView recyclerView, boolean draggable) {

        ItemTouchHelper helper = new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(ItemTouchHelper.DOWN | ItemTouchHelper.UP, 0) {
            @Override
            public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder dragged, @NonNull RecyclerView.ViewHolder target) {

                int draggedPos = dragged.getAdapterPosition();
                int targetPos = target.getAdapterPosition();

                recyclerView.getAdapter().notifyItemMoved(draggedPos, targetPos);

                return true;
            }

            @Override
            public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {

            }
        });

        helper.attachToRecyclerView(recyclerView);
    }

在长按触发拖动的情况下,此方法效果很好,但是当在项目上按下“重新排序控件”时如何触发拖动?

我看到的一个解决方案是,我在与包含RecyclerView的视图关联的ViewModel中实例化ItemTouchHelper,然后通过数据绑定将其附加到RecyclerView。但是,这在某种程度上是不对的。 ItemTouchHelper是一个View类(它扩展了RecyclerView.ItemDecoration),我希望ViewModel中的View相关内容尽可能少。

有人能想到一个更好的解决方案来解决这个问题吗?

0 个答案:

没有答案