【问题标题】:How to detect if Recyclerview item is being swiped?如何检测 Recyclerview 项目是否被刷卡?
【发布时间】:2018-07-31 15:58:43
【问题描述】:

我正在尝试添加滑动删除功能以及在长按 RecyclerView 项目时显示底部工作表弹出窗口。我使用ItemTouchHelper.SimpleCallback 滑动删除,ItemTouchListener 用于在长按项目时显示弹出窗口。 问题是当我滑动项目以删除它时,它也会检测到长按。 我想要的是在滑动项目时它应该忽略长按。 我有 ItemTouchHelper 类,它扩展了 Simplecallback 以进行滑动删除。以下是附加recyclerview的代码,以便滑动删除。

 ItemTouchHelper.SimpleCallback itemTouchHelperCallback = new RecyclerItemTouchHelper(0, ItemTouchHelper.LEFT, this);
    new ItemTouchHelper(itemTouchHelperCallback).attachToRecyclerView(recyclerView);

以下是为长按事件添加监听器的代码。

 recyclerView.addOnItemTouchListener(new NotesRecyclerTouchListener(getApplicationContext(), recyclerView, new NotesRecyclerTouchListener.ClickListener() {
        @Override
        public void onLongClick(View view, int position) {
                Note note = notesList.get(position);
                Toast.makeText(getApplicationContext(), note.getTitle() + " is log pressed!", Toast.LENGTH_SHORT).show();
                View sheetView = MainActivity.this.getLayoutInflater().inflate(R.layout.view_bottom_sheet_dialog, null);
                BottomSheetDialog dialog = new BottomSheetDialog(MainActivity.this);
                dialog.setContentView(sheetView);
                dialog.show();
        }
    }));

【问题讨论】:

  • 添加一个标志怎么样?当调用onSwiped() 事件时,将swiped 标志设置为true。然后如果长点击事件也被触发,检查标志,如果它是真的,那么它是在滑动事件期间,所以不要执行长点击中的代码,退出方法。滑动事件完成后,将标志重置为 false。
  • onSwiped() 将在刷卡完成后调用,但我需要检查是否正在刷卡。
  • 糟糕,我的意思是onChildDraw(),正如以下答案中所建议的那样:)

标签: java android android-recyclerview


【解决方案1】:

onSwiped 将在项目被完全滑动时调用。如果您将开始滑动元素但随后将其移回,则不会调用该方法。所以你不应该使用这种方法来标记刷卡的结束。 你可以像这样使用onChildDraw中的isCurrentlyActive

var swiping: Boolean = false

override fun onChildDraw(c: Canvas, recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, dX: Float, dY: Float, actionState: Int, isCurrentlyActive: Boolean) {
    super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive)
    if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
        swiping = isCurrentlyActive
    }
}

移动元素为true,滑动或取消滑动后为false。

【讨论】:

    【解决方案2】:

    正如@DavidVelasquez 所建议的,您应该在开始滑动时设置一个标志,并根据onLongClick() 中的状态采取行动,但onSwiped() 不是要走的路。相反,您应该使用ItemTouchHelper.SimpleCallback#onChildDraw() 方法来检测滑动生物的时间,并使用onSwiped() 方法来检测它何时结束。

    例如。

    override fun onChildDraw(c: Canvas, recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, dX: Float, dY: Float, actionState: Int,isCurrentlyActive: Boolean) {
        if(actionState == ItemTouchHelper.ACTION_STATE_SWIPE){
            setupMyFlag()
        }
    }
    override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
        clearMyFlag()
    }
    

    然后在你的 onLongClick() 中检查这个标志

    【讨论】:

    • 我这样做的方式略有不同。由于我的 recyclerview 在 MainActivity 中,所以我无法访问 childDraw() 所以我在 ItemTouchHelper 类中声明一个抽象方法并在 mainActivity 中实现该方法以获取 dX 的值,即滑动位移,然后我在 onLongClick() 函数中使用如果(dX
    • @Jan Stoltman 这两种方法都不起作用 onChildDraw() 和 onSwiped。还有其他解决方案吗?
    猜你喜欢
    • 2020-01-16
    • 1970-01-01
    • 2015-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    相关资源
    最近更新 更多