在做项目的时候,经常会有如下图这样的需求,每个按钮都有点击事件,同时还会有删除的状态存在,这时候,onClickListener点击事件就不能完全实现需求,这时候大家都知道用onLongClickListener来解决,但是用过很多次,经常碰到坑,一直都没有总结,这里做下简单笔记。

首先来分析下setOnLongClickListener()这个方法中的参数:
view.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
return false;
}
});
这里的view就是长按的view毋容置疑,那么返回值false到底是什么意思呢?

官方文档里面的解释为:如果让回调消耗该长按,返回true,否则false 意思就是返回true这个长按就结束了,如果false,会有其他地方继续响应该长按,解释并不是很明确,回调消耗,具体是怎么个回调消耗方式?我个人对其并不是完全理解,我相信不止我一个人对这个问题有所疑问。 下面做一个测试:
- 我们return true,然后测试下功能
final ViewHolder finalV = v;
finalV.deleteGvCarupphoto.setVisibility(View.GONE);
v.layoutGvCarupphoto.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
finalV.deleteGvCarupphoto.setVisibility(View.VISIBLE);
return true;
}
});
v.layoutGvCarupphoto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(context,"走了点击事件",Toast.LENGTH_SHORT).show();
}
});
由于本人测试这个项目是在自己项目中直接测试的,可能代码有点繁琐,希望大家不要介意 该代码功能:我们先把删除按钮隐藏,然后在长按监听中显示并return true,再对同一个控件进行点击事件Toast,看一下效果

可以看到,删除按钮展示出来了,Toast并没有执行
- 我们return false,然后进行同样的测试
final ViewHolder finalV = v;
finalV.deleteGvCarupphoto.setVisibility(View.GONE);
v.layoutGvCarupphoto.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
finalV.deleteGvCarupphoto.setVisibility(View.VISIBLE);
return false;
}
});
v.layoutGvCarupphoto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(context,"走了点击事件",Toast.LENGTH_SHORT).show();
}
});
执行一下,看看结果

由此可见:返回true,那么长按监听只执行长按监听中执行的代码,返回false,还会继续响应其他监听中的事件。
PS:网上也有一种说法,说返回false,就再执行一次短的点击事件,从测试结果上来说,虽然效果是这样的,但这种说法我并不认同,从原理上就不一样,官方文档明确说的是false是把长按传递出去,而并非再次执行一次点击事件,只是巧合的是目前长按之后只有onclick一种点击可测试,如再有一种类似的事件来测试,该说法也不攻自破了

推荐下本人的微信公众号,本博客及其他方面的消息会定期同步到公众号上面!
网友评论