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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:26:36