-4

I am currently practising on using Fragment and RecyclerView, and working on a RecyclerView.Adapter class. When I tried to run the project, the app does not run correctly. I found that in the logcat stack trace, there was an error saying

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

I tried debugging, and found out that in my code:

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());
        }
    }
}

This part

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

returns null. But the itemView, which I inflated from

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

does indeed returned a View. But when I try to View.findViewById(), it returns null. I read already the other threads, including this. But it did not solve my problem as I am working with an adapter. Am I missing some steps here?

IntelliJ Amiya
  • 74,896
  • 15
  • 165
  • 198
Ryo
  • 84
  • 1
  • 8
  • 2
    Check if layout `list_item_language` contains ImageView with id `language_logo`. Otherwise your code is correct. – Khemraj Sharma Jun 05 '20 at 07:35
  • Right. Thank you for the answer. I overlooked and was actually using the `android:id` from another layout and thought that it was from `list_item_language`. Thanks again. I was getting crazy already for three days over something trivial. – Ryo Jun 05 '20 at 07:43

1 Answers1

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

NullPointerException is thrown when an application attempts to use an object reference that has the null value.

At first check your all findViewById elements present in respective xml (R.layout.list_item_language) or not.

IntelliJ Amiya
  • 74,896
  • 15
  • 165
  • 198