Правильный способ обращения с предметом Click Recycler View - PullRequest
0 голосов
/ 18 октября 2018

У меня есть 5 строк для отображения в RecyclerView.Когда пользователь нажимает на один из элементов, открывается другое действие.Каждый предмет имеет различную активность.Я обработал событие нажатия, как показано ниже.

switch (getAdapterPosition()) {
                case 1:
                    ActivityUtil.startActivity(itemView.getContext(), BlablaActivity.class);
                    break;
                //other cases
}

Это работает правильно.Но что, если новый элемент будет добавлен в список в будущем?Для каждого отдельного предмета я должен добавить новый футляр к коммутатору.Это не правильное решение в соответствии с принципом открытого закрытого типа.Как мне справиться с этим?Любые предложения будут великолепны ...

Ответы [ 3 ]

0 голосов
/ 18 октября 2018

Это может быть легко обработано, если вы строго заставляете адаптер RecyclerView работать только как представление, то есть отображать только данные с видом.Вся логическая ответственность за принятие решения должна быть делегирована обратно родительскому действию или фрагменту.Это может быть достигнуто с помощью Callback / Listener.

Всякий раз, когда в элементе RecyclerView есть событие щелчка, сообщите родительскому действию или фрагменту, чтобы обработать его.

Вам необходимо изменить свой адаптерчто-то вроде этого:

public class YourAdapter extends RecyclerView.Adapter<YourAdapter.ViewHolder> {

    // Local variable for listener
    private OnItemClickListener listener;

    // Listener interface
    public interface OnItemClickListener {
        void onItemClick(View itemView, int position);
    }

    // set the listener on parent activity or fragment
    public void setOnItemClickListener(OnItemClickListener listener) {
        this.listener = listener;
    }


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

      ....

      public ViewHolder(final View itemView) {
        super(itemView);

        itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (listener != null) return;
                    // tell the parent to handle the item.
                    listener.onItemClick(itemView, position);
                }
            });
      }

    }
}

Тогда вы можете использовать следующее для обработки клика:

// assuming adapter is your adapter
adapter.setOnItemClickListener(new ContactsAdapter.OnItemClickListener() {
    @Override
    public void onItemClick(View view, int position) {
        handleItemClickByPosition(position);
    }
});

...

private void handleItemClickByPosition(int position) {
   switch (getAdapterPosition()) {
     case 1:
       ActivityUtil.startActivity(itemView.getContext(), BlablaActivity.class);
       break;
       //other cases
  }
}

Следовательно, вам не нужно менять адаптер, когда появляется новый элемент вваш адаптер.

0 голосов
/ 18 октября 2018

В идеале вы должны добавить поле Class<? extends Activity> к классу, который представляет ваши элементы RecyclerView.Тогда вы можете просто получить доступ к этому полю в вашем прослушивателе кликов (этот код будет внутри onCreateViewHolder()):

holder.itemView.setOnClickListener(v -> {
    int position = holder.getAdapterPosition();

    if (position != RecyclerView.NO_POSITION) {
        Class<? extends Activity> activityClass = items.get(position).getActivityClass();
        ActivityUtil.startActivity(v.getContext(), activityClass);
    }
});

Таким образом, каждый элемент отвечает за знание того, куда идти, когда на него нажимают.Вы можете добавлять новые элементы в свой список, не касаясь кода адаптера.

0 голосов
/ 18 октября 2018

Сначала сохраните Активность, на которую ссылаются элементы в вашей БД, а затем добавьте ее в свою модель типизированного списка, если это так:

yourlist.java
....
private String BLABLA;
private String BLABLA1;
private String ActivityName;
....

Затем в вашем адаптере OnBindViewholder OnClick сделайте Someting Like This

  @Override
        public void onClick(View v) {

            activityString = singleItem.getActivityName();
            Intent intent= new Intent(context, Class.forName(activityString));
            context.startActivity(intent);
        }
    });
...