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?