Как определить Activity?

168
05 октября 2018, 04:00

Есть два Activity. В обоих RecyclerView с CardView. Хочу использовать для них один и тот же ViewHolder+Adapter. Конечно, Item в CardView немного разные для первого и второго Activity. Поэтому ViewHolder+Adapter должны работать по-разному в зависимости от того для которого Activity они применены.

public class RemindListAdapter extends RecyclerView.Adapter<RemindListAdapter.RemindViewHolder> {
    private List<RemindDTO> data;
    public RemindListAdapter(List<RemindDTO> data) {
        this.data = data;
    }
    @Override
    public RemindViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.remind_item, parent, false);
        return new RemindViewHolder(view);
    }

 @Override
 public void onBindViewHolder(RemindViewHolder holder, int position) {
        final String itemString = data.get(position).getTitle();
     holder.title.setText(itemString);
     holder.cardView.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View view) {
             Intent intent = new Intent(view.getContext(),SongActivity.class);
             intent.putExtra("name", itemString);
             view.getContext().startActivity(intent);
         }
     });
 }
    @Override
    public int getItemCount() {
        return data.size();
    }
    public static class RemindViewHolder extends RecyclerView.ViewHolder{
        CardView cardView;
        TextView title;
        TextView year;
        public RemindViewHolder (View itemView){
            super(itemView);
            cardView=(CardView) itemView.findViewById(R.id.cardView);
            Context context = itemView.getContext();
            if (context.equals(MainActivity.class)){
                title=(TextView)itemView.findViewById(R.id.title);
                year=(TextView) itemView.findViewById(R.id.year);
            }

        }
    }
}

Есть идея сделать проверку так:

public RemindViewHolder (View itemView){
        super(itemView);
        cardView=(CardView) itemView.findViewById(R.id.cardView);
        Context context = itemView.getContext();
        if (context.equals(MainActivity.class)){
            title=(TextView)itemView.findViewById(R.id.title);
            year=(TextView) itemView.findViewById(R.id.year);
        }

    }

Но не понятно, разные ли Context'ы у двух Activity из одного приложения. И применим ли для такой задачи метод equals. Как Adapter'у и Holder'у определить в каком Activity они работают?

Answer 1

Можно сделать универсальный адаптер, который сможет работать с любыми холдерами и моделями. В вашем случае он будет работать с один холдером и 2 моделями.

Для этого нужно:

  • делигировать создание холдеров и их биндинг прослойке между адаптером и холдером с моделью. Я называю этот клас ViewRendererЧто-тотам. Для каждого типа модели(итема) пишется свой рендерер, который наследуется от общего интерфейса ViewRenderer. Все методы в адаптере дергаются через этот интерфейс.
  • наследовать все модели от одного интерфейса,который минимально должен содержать метод getType() - он вызывается в адаптере для определения типа рендерера, с которым необходимо работать для данной модели.
  • для каждой модели и холдера реализовывать свой ViewRenderer в котором будет создаваться холдер и биндится с моделью.

Таким образом можно использовать один адаптер с обсолютно любыми моделями и холдерами.

Понятно что такой подход немного избыточен в вашем случае, т.к. проще написать 2 адаптера, чем делать адаптер и 2 прослойки (ViewRender) для каждой модели. Но если в вашем приложении будет хотя бы 3-4 модели для RecyclerView - этот подход неплохо сократит код.

Подробное описание на русском и примеры с кодом очень хорошо описаны хорошим человеком на известом форуме) Если интересно прочтите это, затем это

READ ALSO
Парсинг различных форматов Date

Парсинг различных форматов Date

Долго пытался разобраться как парсить различные форматы датНа входе такие строки:

134
Java swing + UI scale

Java swing + UI scale

Мне нужно организовать поддержку скалирования интерфейсаВ интерфейсе присутствуют кнопки с иконками и JPanel, на котором они лежат

166
Использование RichTextFX

Использование RichTextFX

У меня есть консоль, которая реализована на TextFlowВ ней меняется цвет, в зависимости от типа сообщения (ERROR - red, WARNING - yellow и тд)

220
Navigation Drawer переход к фрагментам или активити

Navigation Drawer переход к фрагментам или активити

Поискав на просторах интернета, на данный момент не смог найти ответа на свой вопрос, хотя в принципе его должны были неоднократно задавать

146