从 Recyclerview 分离 SwipeListener
Dettach SwipeListener from Recyclerview
我的 RecyclerView
有一个简单的 left/right 滑动侦听器,所以我在片段中创建了以下函数。
ItemTouchHelper itemTouchHelper;
public void setDeleteUpdateSwipeListener() {
ItemTouchHelper.SimpleCallback simpleCallback = new ItemTouchHelper.SimpleCallback(0,
ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
//do stuff
Log.e("i still", "get called");
}
};
itemTouchHelper = new ItemTouchHelper(simpleCallback);
itemTouchHelper.attachToRecyclerView(rvListDriver);
}
如果用户长时间点击某个项目,我不想允许任何擦除,所以我在我的适配器中这样做了:
@Override
public void onBindViewHolder(@NonNull DriverListAdapter.ViewHolder holder, int position) {
final ViewHolder recyclerViewHolder = holder;
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
drListFrag.setNoSwipeListener();
return true;
}
});
}
以及我片段中对应的函数:
public void setNoSwipeListener() {
itemTouchHelper = new ItemTouchHelper(null);
itemTouchHelper.attachToRecyclerView(null);
}
但是,滑动仍在发生,跟踪 Log.e
也会被调用。我确保函数 noSwipe
被调用。我还尝试了其他 ,但其中 none 对我有用。
问题可能是因为我的 RecycerViewAddapter
中没有 swipelistener
,而是在我的 Fragment/RecycerView 对象中。
试试这个
public void setNoSwipeListener() {
// itemTouchHelper = new ItemTouchHelper(null);
itemTouchHelper.attachToRecyclerView(null);
}
您可以使用自定义 ItemTouchHelper.Callback
并覆盖 isItemViewSwipeEnabled()
方法。
该方法的return值决定是否启用滑动。如果 true
则它已启用。
因此,您可以在自定义的 ItemTouchHelper.Callback
中使用一个 setter 的本地布尔字段,并在 setNoSwipeListener()
中将其值切换为 false
]
isItemViewSwipeEnabled()
应该 return 这个本地字段
并且当触摸事件结束时,将此布尔值重置为true
:
holder.listItem.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
// Reset the boolean to true
}
return false;
}
});
我的 RecyclerView
有一个简单的 left/right 滑动侦听器,所以我在片段中创建了以下函数。
ItemTouchHelper itemTouchHelper;
public void setDeleteUpdateSwipeListener() {
ItemTouchHelper.SimpleCallback simpleCallback = new ItemTouchHelper.SimpleCallback(0,
ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
//do stuff
Log.e("i still", "get called");
}
};
itemTouchHelper = new ItemTouchHelper(simpleCallback);
itemTouchHelper.attachToRecyclerView(rvListDriver);
}
如果用户长时间点击某个项目,我不想允许任何擦除,所以我在我的适配器中这样做了:
@Override
public void onBindViewHolder(@NonNull DriverListAdapter.ViewHolder holder, int position) {
final ViewHolder recyclerViewHolder = holder;
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
drListFrag.setNoSwipeListener();
return true;
}
});
}
以及我片段中对应的函数:
public void setNoSwipeListener() {
itemTouchHelper = new ItemTouchHelper(null);
itemTouchHelper.attachToRecyclerView(null);
}
但是,滑动仍在发生,跟踪 Log.e
也会被调用。我确保函数 noSwipe
被调用。我还尝试了其他
问题可能是因为我的 RecycerViewAddapter
中没有 swipelistener
,而是在我的 Fragment/RecycerView 对象中。
试试这个
public void setNoSwipeListener() {
// itemTouchHelper = new ItemTouchHelper(null);
itemTouchHelper.attachToRecyclerView(null);
}
您可以使用自定义 ItemTouchHelper.Callback
并覆盖 isItemViewSwipeEnabled()
方法。
该方法的return值决定是否启用滑动。如果 true
则它已启用。
因此,您可以在自定义的 ItemTouchHelper.Callback
中使用一个 setter 的本地布尔字段,并在 setNoSwipeListener()
false
]
isItemViewSwipeEnabled()
应该 return 这个本地字段
并且当触摸事件结束时,将此布尔值重置为true
:
holder.listItem.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
// Reset the boolean to true
}
return false;
}
});