Есть два 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 они работают?
Можно сделать универсальный адаптер, который сможет работать с любыми холдерами и моделями. В вашем случае он будет работать с один холдером и 2 моделями.
Для этого нужно:
ViewRendererЧто-тотам
. Для каждого типа модели(итема) пишется свой рендерер, который наследуется от общего интерфейса ViewRenderer
. Все методы в адаптере дергаются через этот интерфейс.getType()
- он вызывается в адаптере для
определения типа рендерера, с которым необходимо работать для данной модели.ViewRenderer
в
котором будет создаваться холдер и биндится с моделью.Таким образом можно использовать один адаптер с обсолютно любыми моделями и холдерами.
Понятно что такой подход немного избыточен в вашем случае, т.к. проще написать 2 адаптера, чем делать адаптер и 2 прослойки (ViewRender) для каждой модели. Но если в вашем приложении будет хотя бы 3-4 модели для RecyclerView - этот подход неплохо сократит код.
Подробное описание на русском и примеры с кодом очень хорошо описаны хорошим человеком на известом форуме) Если интересно прочтите это, затем это
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Долго пытался разобраться как парсить различные форматы датНа входе такие строки:
Мне нужно организовать поддержку скалирования интерфейсаВ интерфейсе присутствуют кнопки с иконками и JPanel, на котором они лежат
У меня есть консоль, которая реализована на TextFlowВ ней меняется цвет, в зависимости от типа сообщения (ERROR - red, WARNING - yellow и тд)
Поискав на просторах интернета, на данный момент не смог найти ответа на свой вопрос, хотя в принципе его должны были неоднократно задавать