You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.22 22:06:07