ListView+ArrayAdapter开发App崩溃:View.setTag触发空指针异常求助
解决ListView+ArrayAdapter崩溃:NullPointerException在setTag时
嘿,这个问题我太熟悉了!出现java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.setTag(java.lang.Object)' on a null object reference,本质是你调用setTag()的那个View对象是null,大概率是布局加载或者控件查找环节出了问题,咱们一步步排查:
1. 先检查布局加载的代码
在你的WordAdapter的getView()方法里,加载item布局的代码很可能有问题:
- 错误写法示例(容易导致convertView为null):
convertView = LayoutInflater.from(getContext()).inflate(R.layout.word_item, null); - 正确写法必须传入parent,且第三个参数为
false(ListView会自行处理视图附加):convertView = LayoutInflater.from(getContext()).inflate(R.layout.word_item, parent, false);
如果省略parent参数,inflater可能无法正确解析布局的LayoutParams,甚至返回null。
2. 确认布局文件与控件ID匹配
- 检查你的item布局文件(比如
word_item.xml)是否存在,XML有没有语法错误(比如标签未闭合、属性拼写错误),如果布局加载失败,inflater.inflate()会返回null。 - 检查
findViewById()的ID是否和布局里的控件ID完全一致,大小写、拼写都不能错!比如布局里是@+id/tv_word,代码里写成R.id.tv_Word就会返回null,后续如果错误地把null控件去setTag(不过你的报错是View本身null,所以重点还是布局加载)。
3. 规范ViewHolder模式的写法
给你一个正确的WordAdapter的getView()实现参考,避免空指针:
import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.TextView; public class WordAdapter extends ArrayAdapter<Word> { public WordAdapter(Context context, int resource) { super(context, resource); } @NonNull @Override public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { ViewHolder holder; // 初始化视图 if (convertView == null) { // 正确加载布局 convertView = LayoutInflater.from(getContext()).inflate(R.layout.word_item, parent, false); holder = new ViewHolder(); // 确保ID和布局一致 holder.wordTextView = convertView.findViewById(R.id.tv_word); holder.translationTextView = convertView.findViewById(R.id.tv_translation); // 这里的convertView一定不能是null,否则会触发你遇到的崩溃 convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } // 绑定数据 Word currentWord = getItem(position); if (currentWord != null) { holder.wordTextView.setText(currentWord.getWord()); holder.translationTextView.setText(currentWord.getTranslation()); } return convertView; } // ViewHolder内部类 private static class ViewHolder { TextView wordTextView; TextView translationTextView; } }
4. 额外排查点
- 确认你的
getContext()返回的不是null:如果Adapter初始化时传入的上下文无效,inflater也会加载失败。 - 检查ListView的布局是否正确:确保ListView在Activity/Fragment里被正确初始化,没有用错ID导致找不到ListView。
按照上面的步骤排查,基本就能解决这个空指针问题啦!
内容的提问来源于stack exchange,提问作者RobyJacob
相关产品推荐
相关产品推荐

