Android自定义ArrayAdapter删除ListView行:空指针异常原因分析
解决ListView Adapter删除按钮空指针异常问题
嘿,我来帮你搞定这个困扰你的空指针问题!
问题根源分析
你遇到的java.lang.NullPointerException,本质原因是Adapter里的books成员变量没有被初始化!
看你的构造函数:
public CustomListViewAdapter1(Activity activity, int resource, List<ListView_Model> books) { super(activity, resource, books); this.activity = activity; // 这里漏掉了给this.books赋值! }
虽然你把books传给了父类的ArrayAdapter,但自己的成员变量books还是null状态。当你在删除按钮的点击事件里调用books.remove(index.intValue())时,自然就触发了空指针异常。
分步修复方案
1. 初始化books成员变量
在构造函数里补上对books的赋值,这是解决空指针的核心步骤:
public CustomListViewAdapter1(Activity activity, int resource, List<ListView_Model> books) { super(activity, resource, books); this.activity = activity; this.books = books; // 补上这行,让成员变量指向传入的列表 }
2. 优化ViewHolder的使用(可选但推荐)
你的ViewHolder类里已经定义了imgView_lv_delete_btn2,但在getView方法里又重复执行了findViewById,这会浪费ListView复用的性能。把删除按钮的初始化移到ViewHolder的构造函数里:
private static class ViewHolder { private ImageView images,imgView_lv_edit_btn,imgView_lv_view_btn1,imgView_lv_delete_btn2; private TextView name; private TextView authorName,mobileNo; public ViewHolder(View v) { name = (TextView) v.findViewById(R.id.title); images = (ImageView) v.findViewById(R.id.thumbnail); authorName = (TextView) v.findViewById(R.id.author); mobileNo = (TextView) v.findViewById(R.id.MobileNo); imgView_lv_edit_btn = (ImageView) v.findViewById(R.id.listview_edit_btn); imgView_lv_view_btn1 = (ImageView) v.findViewById(R.id.listview_view_btn1); imgView_lv_delete_btn2 = (ImageView) v.findViewById(R.id.listview_delete_btn2); // 移到这里初始化 } }
然后在getView里删掉重复的findViewById代码,直接使用ViewHolder的引用:
// 删掉这行:holder.imgView_lv_delete_btn2= (ImageView) convertView.findViewById(R.id.listview_delete_btn2); holder.imgView_lv_delete_btn2.setTag(position); holder.imgView_lv_delete_btn2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Integer index = (Integer)v.getTag(); System.out.println("Index is:"+index); books.remove(index.intValue()); notifyDataSetChanged(); } });
3. 优化位置获取方式(避免复用导致的位置错误)
ListView的复用机制可能导致setTag(position)获取的位置不准确,推荐用更可靠的方式获取当前行的位置:
holder.imgView_lv_delete_btn2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 通过getPositionForView获取当前点击行的真实位置 int position = getPositionForView(v); if (position != ListView.INVALID_POSITION) { books.remove(position); notifyDataSetChanged(); } } });
验证修复效果
完成以上修改后,点击删除按钮就能正常移除对应列表项,并且ListView会自动刷新显示剩余内容,空指针异常也会消失啦!
内容的提问来源于stack exchange,提问作者Achiever
相关产品推荐
相关产品推荐

