我最近实施了一个小型的RecyclerView设置,并试用了recyclerview选择库。到目前为止,选择工作正常,但我还在recyclerview项目上连接了一个点击处理程序,现在每次我长按一个项目来激活选择模式,它也算作一个简单的点击并且活动发生变化(因为那是什么我把它编程为项目点击)。我设法通过向我的recyclerview适配器添加一个简单的布尔值来避免这种情况,该适配器在选择模式启动时调用:
void setIgnoreClicks(boolean b) {
this.ignoreClicks = b;
}
然后在我的viewholder的bind-function中:
void bind(MyModelClass m) {
...
view.setOnClickListener(() -> {
if(!adapter.isIgnoreClicks()) {
...
}
});
}
现在当选择模式结束时,布尔值被设置回假,并且点击再次通过。
问题是,当只选择了一个项目并点击它以将其删除时,选择模式也会退出 - 这很好,除了现在不再忽略该点击,因此,活动会发生变化。我想要的基本上是忽略最后一次点击。如果选择模式仍处于活动状态,是否有某种方法可以停止事件?
谢谢
好的,我自己解决了。我所做的是在我的recyclerview中添加一个触摸监听器,如果操作模式处于活动状态且没有单击任何项目,则设置忽略Click to true:
modelList.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
@Override
public boolean onInterceptTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {
if (e.getAction() != MotionEvent.ACTION_UP)
return false;
if(actionMode != null)
ignoreClick = rv.findChildViewUnder(e.getX(), e.getY()) != null; // ignore click if child is null (not clicked on a child, but the empty background of the recycler view)
return false;
}
...
});
然后在我的项目单击处理程序中:
private void showDetails(final Model model) {
if(ignoreClick)
ignoreClick = false; // the click is ignored, reset to false
else if (!selectionTracker.hasSelection()) {
final Intent intent = new Intent(MainActivity.this, ModelViewActivity.class);
intent.putExtra(Codes.DATA_MODEL, model);
startActivityForResult(intent, Codes.INTENT_MODEL_SHOW);
}
}