Java 如何检测是否正在刷卡Recyclerview项目?
我正在尝试添加滑动删除功能,以及在长按RecyclerView项时显示底部工作表弹出窗口。我正在使用Java 如何检测是否正在刷卡Recyclerview项目?,java,android,android-recyclerview,Java,Android,Android Recyclerview,我正在尝试添加滑动删除功能,以及在长按RecyclerView项时显示底部工作表弹出窗口。我正在使用ItemTouchHelper.SimpleCallback进行滑动删除,并使用ItemTouchListener在长按项目时显示弹出窗口。 问题是,当我滑动项目以删除其内容时,也会检测到长按。 我想要的是,当物品被刷洗时,它应该忽略长按。 我有一个ItemTouchHelper类,它扩展了Simplecallback以进行滑动删除。以下是附加recyclerview以便刷卡删除的代码 Item
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();
}
}));
正如@DavidVelasquez所建议的,您应该在刷卡开始时设置一个标志,并根据您的
onLongClick()
中的状态进行操作,但onsweep()
不是一个好办法。相反,您应该使用ItemTouchHelper.SimpleCallback#onchildraw()
方法来检测刷卡的时间,并使用onsweep()方法来检测刷卡的结束时间
例如
然后只需在onLongClick()中选中此标志,当项目将被完全刷洗时,将调用擦除的。如果您将开始滑动元素,然后将其向后移动,则不会调用该方法。因此,您不应该使用此方法来标记刷卡的结束。
您可以从onchildraw
这样使用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
}
}
滑动或取消滑动后,移动元素时为真,滑动或取消滑动后为假。添加标志如何?调用onsweed()
事件时,将swied
标志设置为true
。然后,如果长单击事件也被触发,请检查该标志,如果该标志为真,则该标志在滑动事件期间,因此不要执行长单击中的代码,只需退出该方法即可。当刷卡事件完成时,将标志重置为false。刷卡完成后将调用onsweep(),但我需要检查刷卡是否正在进行。哎呀,我的意思是onchildraw()
,如下面的回答所示:)我是以稍微不同的方式执行的。由于我的recyclerview在MainActivity中,因此我将无法访问childDraw(),因此我在ItemTouchHelper类中声明了一个抽象方法,并在MainActivity中实现该方法,以获取dX的值,该值为滑动位移,然后我在onLongClick()函数中使用,如果(dX@Jan Stoltman这不起作用。两个方法都被称为onchildraw()和onsweep。还有其他解决方案吗?
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
}
}