NullPointerException при клике на элемент

293
05 января 2017, 05:49

Есть список имен, по которому нажимаю. После чего должен сохраняться нажатый элемент, который я использую в другом фрагменте.

Список загружается, но при кликах на имена выбивает следующую ошибку:

java.lang.NullPointerException: Attempt to invoke interface method 'void com.vm.sai.adapters.PersonAdapter$OnRecItemClickListener.onRecItemClick(int)' on a null object reference
at com.vm.sai.adapters.PersonAdapter$PersonViewHolder.onClick(PersonAdapter.java:57)

Код адаптера:

public class PersonAdapter extends RecyclerView.Adapter<PersonAdapter.PersonViewHolder> {
    List<String> perscategories;
    OnRecItemClickListener onRecItemClickListener;
    public PersonAdapter(List<String> perscategories, OnRecItemClickListener onRecItemClickListener) {
        this.onRecItemClickListener = onRecItemClickListener;
        this.perscategories = perscategories;
    }
    public interface OnRecItemClickListener {
        void onRecItemClick(int position);
    }
    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
    }

    public static class PersonViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        private TextView personName;
        private int position;
        private OnRecItemClickListener onRecItemClickListener;
        PersonViewHolder(View itemView, OnRecItemClickListener onRecItemClickListener) {
            super(itemView);
            personName = (TextView) itemView.findViewById(R.id.persname);
            personName.setOnClickListener(this);
        }
        public void bind(String text, int position) {
            this.position = position;
            personName.setText(text);
        }
        @Override
        public void onClick(View v) {
            onRecItemClickListener.onRecItemClick(position);
        }
    }
    @Override
    public PersonViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(viewGroup.getContext())
                .inflate(R.layout.person_list_item, viewGroup, false);
        return new PersonViewHolder(v, onRecItemClickListener);
    }
    @Override
    public void onBindViewHolder(PersonViewHolder personViewHolder, final int position) {
        personViewHolder.bind(perscategories.get(position), position);
    }
    @Override
    public int getItemCount() {
        return perscategories.size();
    }
}

Фрагмент в котором создаю экземпляр класса:

private void initializeAdapter() {
    PersonAdapter personAdapter = new PersonAdapter(personCategories, new PersonAdapter.OnRecItemClickListener() {
        @Override
        public void onRecItemClick(int position) {
            saveFavorites(position);
        }
    });
    recyclerView.setAdapter(personAdapter);
}
Answer 1

Данное исключение говорит о том, что Вы пытаетесь вызвать метод на объекте, который проинициализирован значением null.

Вы пытаетесь вызвать метод onRecItemClick(...) на объекте onRecItemClickListener, в котором находится null.

Решением данной проблемы будет инициализация объекта onRecItemClickListener (до его использования).

Answer 2

Вы передали слушатель в холдер, но не присвоили его переменной холдера.

Можно по разному решить

  1. Таки присвоить значение из аргумента конструктора холдера полю холдера.
  2. Убрать слушатель из холдера и из его конструктора, сделать класс холдера НЕстатическим и тогда будет использоваться слушатель из поля адаптера, а не холдера.
READ ALSO
Ошибка при отправке файла на сервер Retrofit2

Ошибка при отправке файла на сервер Retrofit2

Отправляю файл на сервер с помощью Retrofit2, использую POST метод для отправки файла, POST метод принимает два параметра "file" и "shared-with":

299
Java. Совместимось интерфейсов

Java. Совместимось интерфейсов

В Java 15 был введен интерфейс Closeable с одним методом close()

273
Не воспроизводится ts-поток

Не воспроизводится ts-поток

Пытаюсь воспроизвести закодированный h264 в MPEG-TS видеопоток, используя стандартный VideoViewВся программа состоит из одной activity с VideoView, Button и EditText

304
Не могу вывести иконку в пункт списка

Не могу вывести иконку в пункт списка

Пытаюсь вывести иконки для пунктов меню, но не совсем знаю как правильно это сделатьПриложение делает следующее: Есть файл json с объектами

288