ListView子项内控件仅响应双击不响应单击事件的解决咨询
问题根本原因
你当前的代码将子控件的点击监听器注册逻辑放在了列表项的点击回调里,也就是说只有触发过一次列表项点击之后,子控件的点击监听器才会被注册,所以首次点击子控件时监听器还未生效,第二次点击才会执行对应逻辑,这就是需要点击两次才触发操作的核心原因。
解决步骤
- 第一步:删除你现有写在
setOnItemClickListener内部的子控件点击注册代码,该位置不适合做子控件的事件绑定。 - 第二步:将子控件的点击事件注册逻辑移到ListView对应Adapter的
getView方法中,在列表项渲染绑定数据的阶段就完成监听器注册,示例代码如下:
@Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; // 列表项复用逻辑 if (convertView == null) { convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.your_list_item_layout, parent, false); holder = new ViewHolder(); holder.imgOpen = convertView.findViewById(R.id.pImage); holder.btnOpen = convertView.findViewById(R.id.btnOpen); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } // 绑定子控件点击事件,可直接使用当前position关联对应数据 holder.imgOpen.setOnClickListener(v -> { // ImageView对应点击逻辑 }); holder.btnOpen.setOnClickListener(v -> { // Button对应点击逻辑 }); // 原有其他数据绑定逻辑 return convertView; } // 列表项缓存ViewHolder static class ViewHolder { ImageView imgOpen; Button btnOpen; // 其他列表项控件声明 }
- 第三步:如果你需要同时保留列表项整体点击和子控件点击,在列表项布局的根节点、ImageView、Button节点都添加如下属性,避免子控件抢占焦点导致列表项点击失效:
android:focusable="false" android:focusableInTouchMode="false"
内容的提问来源于stack exchange,提问作者Serenity Emmanuel
相关产品推荐
相关产品推荐

