Как инициализировать слушателя в адаптере утилизатора? - PullRequest
0 голосов
/ 18 апреля 2020

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

java.lang.NullPointerException: Attempt to invoke interface method 'void com.eataway.partner.adapters.MenuAdapter$SectionAdapterListener.onSectionSend(int)' on a null object reference
        at com.rest.partner.adapters.MenuAdapter.lambda$onBindViewHolder$0$MenuAdapter(MenuAdapter.java:82)
        at com.rest.partner.adapters.-$$Lambda$MenuAdapter$TzEQ_dT_4Yb5iXO0LwjA0DjCNEI.onClick(Unknown Source:4)

Вот соответствующий код адаптера. Вверху находится класс конструктора, за которым следуют определение и настройка слушателя. Затем в onBindViewHolder я запускаю действие щелчка для элемента, т. Е. Весь вид для этого элемента является интерактивным. А внизу - внутренний класс для соответствующего viewHolder.

// Constructor class
    public MenuAdapter(Context adapterContext, ArrayList<DishItem> restaurantDishItemArrayList) {
        this.adapterContext = adapterContext;
        this.restaurantDishItemArrayList = restaurantDishItemArrayList;
    }

    // Define listener to send chosen section
    public interface SectionAdapterListener {
        void onSectionSend(int position);
    }

    // Set the listener. Must be called from the fragment
    public void setSectionAdapterListener(SectionAdapterListener sectionAdapterListener) {
        this.sectionAdapterListener = sectionAdapterListener;
    }

@Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int position) {
        if (adapterContext instanceof SectionAdapterListener) sectionAdapterListener = (SectionAdapterListener) adapterContext;
        if (holder instanceof SectionViewHolder) {
            ((SectionViewHolder)holder).tvHeaderName.setText(restaurantDishItemArrayList.get(position).getHeaderName());
            if (sectionAdapterListener == null ) Log.d(TAG, "listener is null");
            ((SectionViewHolder)holder).viewForeground.setOnClickListener(v -> sectionAdapterListener.onSectionSend(position));

        } else if (holder instanceof DishViewHolder) {
            ((DishViewHolder)holder).tvMenuItemName.setText(restaurantDishItemArrayList.get(position).getMenuItemName());
            ((DishViewHolder)holder).tvMenuItemDescription.setText(restaurantDishItemArrayList.get(position).getMenuItemDescription());
            }
    }

public class SectionViewHolder extends RecyclerView.ViewHolder {

        private TextView tvHeaderName;
        private RelativeLayout viewForeground;

        public SectionViewHolder(@NonNull View itemView) {
            super(itemView);

            tvHeaderName = itemView.findViewById(R.id.menu_header_name);
            viewForeground = itemView.findViewById(R.id.foreground_view);
        }
    }

Ответы [ 3 ]

0 голосов
/ 18 апреля 2020

Чтобы избежать NullPointerException, проверьте, является ли слушатель нулевым, перед использованием его метода, поэтому измените onBindViewHolder() на возвращение, если sectionAdapterListener равно null

@Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int position) {
        if (adapterContext instanceof SectionAdapterListener) sectionAdapterListener = (SectionAdapterListener) adapterContext;
        if (holder instanceof SectionViewHolder) {
            ((SectionViewHolder)holder).tvHeaderName.setText(restaurantDishItemArrayList.get(position).getHeaderName());
            if (sectionAdapterListener == null ) {
                Log.d(TAG, "listener is null");
                return;
            }
            ((SectionViewHolder)holder).viewForeground.setOnClickListener(v -> sectionAdapterListener.onSectionSend(position));

        } else if (holder instanceof DishViewHolder) {
            ((DishViewHolder)holder).tvMenuItemName.setText(restaurantDishItemArrayList.get(position).getMenuItemName());
            ((DishViewHolder)holder).tvMenuItemDescription.setText(restaurantDishItemArrayList.get(position).getMenuItemDescription());
        }
    }

В противном случае вам нужно вызвать setSectionAdapterListener() из действия / фрагмента, который создает этот адаптер

0 голосов
/ 18 апреля 2020

Вы можете добавить приведенный ниже код в метод onBindViewHolder вашего класса адаптера.

holder.itemView.setonClickListener{
 //add your code here....
}
0 голосов
/ 18 апреля 2020

Создать интерфейсный класс. Затем добавьте интерфейс в свой конструктор RecyclerAdapter.

 YourInterface listener;

 public MenuAdapter(YourInterface listener, Context adapterContext, ArrayList<DishItem> restaurantDishItemArrayList) {
        this.listener = listener;
        this.adapterContext = adapterContext;
        this.restaurantDishItemArrayList = restaurantDishItemArrayList;
    }

Затем в вашей деятельности

MenuAdapter menuAdapter = new MenuAdapter(listener, context, arraylist);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...