使用自定义Adapter的ListView点击事件失效,点击列表项关闭AlertDialog求解
问题解决方案
核心原因
ListView的OnItemClickListener无法触发是以下两个问题共同导致的:
- 你在自定义Adapter的
getView()方法中,手动给item根布局row设置了空的OnClickListener,直接消费了点击事件,导致ListView层级的点击回调无法被触发 - item布局中包含
EditText、Button这类默认可抢占焦点的控件,会拦截item的点击事件
修复步骤
- 首先删除自定义Adapter
getView()方法中冗余的根布局点击监听代码,移除以下片段:
row.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { } });
- 在item布局
R.layout.batch_sales_list的根节点添加如下属性,拦截子控件的焦点抢占:
android:descendantFocusability="blocksDescendants"
如果你的unitBtn等控件需要单独响应点击,单独给对应控件添加android:focusable="false"属性即可。
- 完善AlertDialog代码中
ListView的点击监听逻辑,添加关闭弹窗的代码:
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // 可在此处添加获取选中产品、赋值到上层页面的逻辑 OrderListModel selectedProduct = listAdapter.getItem(position); // 关闭当前弹窗 ad.dismiss(); } });
额外注意
你当前代码中初始化listAdapter的行存在语法错误,多余的R.id.productprice});片段需要删除,修正为符合你的Adapter构造方法的正确写法。
内容的提问来源于stack exchange,提问作者Goblin_Thedev
相关产品推荐
相关产品推荐

