长按刷新列表后取消ListView上的点击事件

Posted

技术标签:

【中文标题】长按刷新列表后取消ListView上的点击事件【英文标题】:Cancel tap event on ListView after long pressing and refreshing list 【发布时间】:2018-05-26 08:13:10 【问题描述】:

我有一个OnLongClickListener 附加到我的列表项视图中的一个视图(不是ListView 本身)。即使我在onLongClick 回调中返回true,一旦手指离开屏幕,ListView 上的onItemClick 也会被调用。通常这不会发生,但长按会在适配器上触发notifyDataSetChanged,这似乎会重置某些状态并将触摸事件注册为新项目单击。

我想阻止这个额外的onItemClick 触发。我试图使视图无效并取消挂起的输入事件,但也没有成功。

【问题讨论】:

【参考方案1】:

这更像是一个 hacky 解决方法而不是解决方案,如果有人能提供更好的答案,我会很高兴。在我的onLongClick 回调中,我请求关注嵌入视图,然后在 500 毫秒后释放该焦点。这给了我想要的行为,但我宁愿不必依赖计时事件。

view.setOnLongClickListener(new OnLongClickListener() 
    @Override
    public boolean onLongClick(View v) 
        // ...
        adapter.notifyDataSetChanged();

        // Request focus to prevent another click event.
        view.setFocusable(true);
        view.requestFocus();

        // Release focus after a short delay.
        final Handler handler = new Handler();
        handler.postDelayed(new Runnable() 
            @Override
            public void run() 
                view.setFocusable(false);
            
        , 500);

        return true;
    
);

```

【讨论】:

【参考方案2】:

Source

请注意,上面示例中的 onClick() 回调没有返回值,但其他一些事件侦听器方法必须返回一个布尔值。原因取决于事件。对于少数这样做的人,原因如下:

onLongClick() - 这将返回一个布尔值来指示您是否已经消费了该事件并且不应该进一步携带它。也就是说,返回 true 表示您已经处理了该事件,它应该在这里停止;如果您还没有处理它,则返回 false 和/或事件应该继续到任何其他点击监听器。

【讨论】:

以上是关于长按刷新列表后取消ListView上的点击事件的主要内容,如果未能解决你的问题,请参考以下文章

android中的listview当长按事件触发后怎么接着触发点击事件。。。

禁用 Android ListView 项目上的点击事件

如何只屏蔽headerView上的长按事件

ListView的长按事件和点击事件冲突的解决办法

Android listview - 长按显示错误的上下文菜单

android Fragment下的listview 怎么样可以设置单击事件和长按事件