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
相关产品推荐
相关产品推荐

