#java #android #recyclerview #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; } }
Ответы
Ответ 1
Как вариант, можно определить адаптер следующим образом: 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; } } Ответ 2
Во первых не используй массивы. Используй List! Во вторых не используй несколько массивов. Используй один List. public class YourItem{ private String title; private String detail; private int image; ... } и в адатер передавай список этих итемов. и тогда сможешь один адаптер для нескольких юзать.
Комментариев нет:
Отправить комментарий