Страницы

Поиск по вопросам

среда, 10 апреля 2019 г.

Как использовать один adapter для нескольких фрагментов?

Имеется несколько фрагментов. В каждом из фрагментов есть RecyclerView со своим adapter'ом. На момент создания 3-го адаптера понял, что они в принципе схожи по своей структуре, ну что разве за исключением массивов в которых я храню текст и картинки. Ну и собственно меня натолкнуло на мысль, как возможно, а главное стоит ли использовать для всех моих фрагментов? На данный момент код одного из моих адаптеров следующий:
public class CardAdapter extends RecyclerView.Adapter {
private String[] titles = {"Chapter One", "Chapter Two", "Chapter Three", "Chapter Four", "Chapter Five", "Chapter Six", "Chapter Seven", "Chapter Eight"};
private String[] details = {"Item one details", "Item two details", "Item three details", "Item four details", "Item file details", "Item six details", "Item seven details", "Item eight details"};
private int[] images = { R.drawable.android_image_1, R.drawable.android_image_2, R.drawable.android_image_3, R.drawable.android_image_4, R.drawable.android_image_5, R.drawable.android_image_6, R.drawable.android_image_7, R.drawable.android_image_8 };
class ViewHolder extends RecyclerView.ViewHolder{
public int currentItem; public ImageView itemImage; public TextView itemTitle; public TextView itemDetail;
public ViewHolder(View itemView) { super(itemView); itemImage = (ImageView)itemView.findViewById(R.id.item_image); itemTitle = (TextView)itemView.findViewById(R.id.item_title); itemDetail = (TextView)itemView.findViewById(R.id.item_detail);
itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int position = getAdapterPosition();
Snackbar.make(v, "Click detected on item " + position, Snackbar.LENGTH_LONG) .setAction("Action", null).show(); } }); } }
@Override public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View v = LayoutInflater.from(viewGroup.getContext()) .inflate(R.layout.card_layout, viewGroup, false); ViewHolder viewHolder = new ViewHolder(v); return viewHolder; }
@Override public void onBindViewHolder(ViewHolder viewHolder, int i) { viewHolder.itemTitle.setText(titles[i]); viewHolder.itemDetail.setText(details[i]); viewHolder.itemImage.setImageResource(images[i]); }
@Override public int getItemCount() { return titles.length; } }


Ответ

Как вариант, можно определить адаптер следующим образом:
public class CardAdapter extends RecyclerView.Adapter {
private String[] titles;
private String[] details;
private int[] images;
class ViewHolder extends RecyclerView.ViewHolder{
public int currentItem; public ImageView itemImage; public TextView itemTitle; public TextView itemDetail;
public CardAdapter(String[] titles, String[] details, int[] images) { this.titles = new String[titles.length]; System.arraycopy(titles, 0, this.titles, 0, titles.length);
this.details = new String[details.length]; System.arraycopy(details, 0, this.details, 0, details.length);
this.images = new int[images.length]; System.arraycopy(images, 0, this.images, 0, images.length); }
public ViewHolder(View itemView) { super(itemView); itemImage = (ImageView)itemView.findViewById(R.id.item_image); itemTitle = (TextView)itemView.findViewById(R.id.item_title); itemDetail = (TextView)itemView.findViewById(R.id.item_detail);
itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int position = getAdapterPosition();
Snackbar.make(v, "Click detected on item " + position, Snackbar.LENGTH_LONG) .setAction("Action", null).show(); } }); } }
@Override public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View v = LayoutInflater.from(viewGroup.getContext()) .inflate(R.layout.card_layout, viewGroup, false); ViewHolder viewHolder = new ViewHolder(v); return viewHolder; }
@Override public void onBindViewHolder(ViewHolder viewHolder, int i) { viewHolder.itemTitle.setText(titles[i]); viewHolder.itemDetail.setText(details[i]); viewHolder.itemImage.setImageResource(images[i]); }
@Override public int getItemCount() { return titles.length; } }
И при создании адаптера использовать следующий конструктор:
public CardAdapter(String[] titles, String[] details, int[] images)
Куда передавать Ваши конкретные для каждого адаптера titles, details и images

А вообще, если у Вас элементы списка постоянны, то правильнее будем воспользоваться наследованием, чем выносить инициализацию этих статичных элементов куда-либо за пределы адаптера

А самый правильный способ, наверное, заключается в реализации в адаптере методов, которые будут инициализировать массивы. Добавляете в адаптер конструктор, который будет принимать некоторое значение – тип адаптера, и, в зависимости от этого типа из конструктора будет вызываться соответствующий метод для инициализации массивов.
Пример:
public CardAdapter(int type) { switch (type) { case 0: // вызов метода для инициализации массивов одними значениями break; case 1: // вызов метода для инициализации массивов другими значениями break; case 2: // вызов метода для инициализации массивов третьими значениями break; } }

Комментариев нет:

Отправить комментарий