Android自定义BaseAdapter适配ListView时getCount方法空指针异常
问题根因
错误出在MainActivity的fillList方法第一行代码:
userList = new ArrayList<UserModel>(userList);
你在类中仅声明了List<UserModel> userList;成员变量,没有做初始化,它的默认值为null。当你把null作为参数传入ArrayList的构造方法时,会直接触发空指针,导致后续传入适配器的数据集本身就是null,适配器getCount方法调用uList.size()时就抛出了对应的空指针异常。
修复方案
- 修改
fillList方法中的列表初始化逻辑,直接创建空的ArrayList即可,不需要传入未初始化的userList:
// 把原来的userList = new ArrayList<UserModel>(userList);替换为下面的代码 userList = new ArrayList<>();
- 可以给适配器增加空判断兜底,避免后续误传null数据集时崩溃:
修改UserListAdapter的getCount方法:
@Override public int getCount() { return uList == null ? 0 : uList.size(); }
同时getItem方法也可以同步加空判断:
@Override public Object getItem(int position) { return uList == null ? null : uList.get(position); }
可选优化
当前适配器的getView方法每次都会重新inflate布局,没有复用convertView,列表滑动时会有性能损耗,可以改成复用逻辑提升流畅度:
@Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = LayoutInflater.from(context).inflate(R.layout.layout, parent, false); holder = new ViewHolder(); holder.name = convertView.findViewById(R.id.namexml); holder.surname = convertView.findViewById(R.id.surnamexml); holder.age = convertView.findViewById(R.id.agexml); holder.team = convertView.findViewById(R.id.teamxml); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } UserModel user = uList.get(position); holder.name.setText(user.getName()); holder.surname.setText(user.getSurname()); holder.age.setText(user.getAge()); holder.team.setText(user.getTeam()); return convertView; } // 新增ViewHolder内部类 static class ViewHolder { TextView name; TextView surname; TextView age; TextView team; }
内容的提问来源于stack exchange,提问作者Fatih Boyalı
相关产品推荐
相关产品推荐

