Android开发:使用Volley时ListView的setOnItemClickListener为何不生效?
ListView 点击事件不触发排查方案
修正Adapter的getView逻辑bug
你当前的getView方法把文本赋值代码写在了else分支里,只有复用convertView时才会执行赋值,第一次创建convertView时仅完成控件绑定、没有设置文本,会导致初始加载的item无数据、滚动复用后才显示内容。
把文本赋值代码移到if-else分支外,无论新建还是复用convertView都执行赋值:
@Override public View getView(int position, View convertView, ViewGroup parent) { TransactionHander handler = null; if(convertView==null) { convertView = inflater.inflate(R.layout.activity_transaction_data, null); handler = new TransactionHander(); handler.tracking_code = convertView.findViewById(R.id.track_code); handler.tracking_fee = convertView.findViewById(R.id.track_fee); handler.tracking_status = convertView.findViewById(R.id.track_status); convertView.setTag(handler); }else{ handler=(TransactionHander) convertView.getTag(); } // 移到此处统一执行赋值 handler.tracking_code.setText(list.get(position).getTrack_code()); handler.tracking_fee.setText(list.get(position).getTrack_fee()); handler.tracking_status.setText(list.get(position).getTrack_status()); return convertView; }
最常见根因:item布局焦点抢占
打开item布局activity_transaction_data.xml,检查以下配置:
- 若item根布局或内部TextView/其他控件设置了
android:focusable="true"、android:clickable="true",直接移除,这类配置会拦截触摸事件,导致ListView的item点击事件无法触发 - 若item内部必须使用可点击控件(如按钮、复选框),在item根布局添加属性
android:descendantFocusability="blocksDescendants",让子控件不拦截item的点击事件 - 禁止在item布局中使用默认可点击的原生控件(如Button),这类控件默认会抢占焦点,若必须使用需给其单独设置
android:focusable="false"
额外确认项
Volley请求成功拿到数据后,确认执行了以下操作:
- 把返回的数据添加到Adapter关联的
list集合中 - 调用
adapter.notifyDataSetChanged()刷新列表,避免数据未正确绑定的问题
内容的提问来源于stack exchange,提问作者Tude Christian Neil
相关产品推荐
相关产品推荐

