首页 > 解决方案 > 为什么我的 View.findViewById 返回 null?

问题描述

我目前正在练习使用Fragmentand RecyclerView,并在RecyclerView.Adapter课堂上工作。当我尝试运行该项目时,该应用程序无法正常运行。我发现在logcat堆栈跟踪中,有一个错误说

    java.lang.NullPointerException: Attempt to invoke virtual method 'void 
    android.widget.ImageView.setImageResource(int)' on a null object reference

我尝试调试,并在我的代码中发现:

public class LanguageAdapter extends RecyclerView.Adapter<LanguageAdapter.LanguageViewHolder> {

    private List<Language> mLanguageList;

    public LanguageAdapter(List<Language> languageList) {
        mLanguageList = languageList;
    }

    @NonNull
    @Override
    public LanguageViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.list_item_language, parent, false);

        return new LanguageViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull LanguageViewHolder holder, int position) {
        Language language = mLanguageList.get(position);
        holder.bind(language);
    }

    @Override
    public int getItemCount() {
        return mLanguageList.size();
    }

    public class LanguageViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        private ImageView mLanguageLogoImageView;
        private TextView mLanguageNameTextView;
        private TextView mLanguageRankTextView;
        private Language mLanguage;

        public LanguageViewHolder(@NonNull View itemView) {
            super(itemView);
            mLanguageLogoImageView = itemView.findViewById(R.id.language_logo);
            mLanguageNameTextView = itemView.findViewById(R.id.language_name);
            mLanguageRankTextView = itemView.findViewById(R.id.language_rank);
        }

        @Override
        public void onClick(View v) {

        }

        private void bind(Language language) {
            mLanguage = language;
            mLanguageLogoImageView.setImageResource(mLanguage.getLanguageLogo());
            mLanguageNameTextView.setText(mLanguage.getLanguageName());
            mLanguageRankTextView.setText(mLanguage.getLanguageRank());
        }
    }
}

这部分

    mLanguageLogoImageView = itemView.findViewById(R.id.language_logo);
    mLanguageNameTextView = itemView.findViewById(R.id.language_name);
    mLanguageRankTextView = itemView.findViewById(R.id.language_rank);

返回空值。但是itemView,我从

    View itemView = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.list_item_language, parent, false);

确实返回了一个View. 但是当我尝试时View.findViewById(),它返回null。我已经阅读了其他线程,包括这个。但它并没有解决我的问题,因为我正在使用适配器。我在这里错过了一些步骤吗?

标签: javaandroid

解决方案


  mLanguageLogoImageView = itemView.findViewById(R.id.language_logo);
  mLanguageNameTextView = itemView.findViewById(R.id.language_name);
  mLanguageRankTextView = itemView.findViewById(R.id.language_rank);

当应用程序尝试使用具有 null 值的对象引用时,将引发NullPointerException 。

首先检查是否存在相应 xml 中的所有 findViewById 元素(R.layout.list_item_language)


推荐阅读