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

Android中限制ArrayAdapter显示6项时数据为空报错的解决方法

修复ArrayAdapter强制返回固定数量导致的数组越界问题

这个错误的根源其实很直白:你在getCount()里硬写了返回6,但当你的数据源datas是空集合的时候,ListView会根据getCount的结果尝试创建6个列表项,结果在getView()里调用datas.get(position)时,因为集合里根本没有对应位置的元素,直接触发了IndexOutOfBoundsException——毕竟空集合连第0个元素都拿不出来嘛。

核心修复步骤

  • 修正getCount()的返回逻辑
    别直接返回固定值6了,改成取数据源实际大小和6的最小值,这样既能保证最多显示6项,又不会在数据源为空时踩坑:

    @Override 
    public int getCount() { 
        return Math.min(datas.size(), 6); 
    }
    

    这样一来,当数据源为空时,getCount返回0,ListView就不会去调用getView,自然不会报错;当数据源有超过6项时,只显示前6项,完全符合你的需求。

  • 可选:添加空状态提示(更友好)
    如果你想在数据源为空时给用户一个明确的提示(比如“暂无出价记录”),可以额外处理空状态:

    @Override 
    public int getCount() { 
        // 空数据源时返回1,用来显示提示项
        return datas.isEmpty() ? 1 : Math.min(datas.size(), 6); 
    }
    
    @NonNull 
    @Override 
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        if(datas.isEmpty()){
            // 加载空状态布局
            View emptyView = View.inflate(context, R.layout.layout_empty_bid, null);
            TextView emptyTip = emptyView.findViewById(R.id.tv_empty_tip);
            emptyTip.setText("暂无出价记录");
            return emptyView;
        }
        // 原有正常加载数据的逻辑
        View v = View.inflate(context, layout, null);
        Bid model = datas.get(position);
        // ... 你的原有赋值代码
        return v;
    }
    

额外优化建议

  • 你的Adapter现在每次getView都inflate新视图,会影响列表滚动性能,建议改成ViewHolder模式复用视图:
    static class BidViewHolder {
        TextView edtUserName, time, price;
        ImageView User, line1;
    }
    
    @NonNull 
    @Override 
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        BidViewHolder holder;
        if(convertView == null){
            convertView = View.inflate(context, layout, null);
            holder = new BidViewHolder();
            holder.edtUserName = convertView.findViewById(R.id.edtUserName);
            holder.line1 = convertView.findViewById(R.id.line1);
            holder.time = convertView.findViewById(R.id.time);
            holder.price = convertView.findViewById(R.id.price);
            holder.User = convertView.findViewById(R.id.User);
            convertView.setTag(holder);
        } else {
            holder = (BidViewHolder) convertView.getTag();
        }
        // 直接用holder操作控件,避免重复findViewById
        Bid model = datas.get(position);
        holder.edtUserName.setText(model.getName());
        holder.time.setText(getDateCurrentTimeZone(model.getEnd()) + "");
        // ... 其他赋值逻辑
        return convertView;
    }
    

内容的提问来源于stack exchange,提问作者pom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:58:06