Имеется несколько фрагментов. В каждом из фрагментов есть 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;
}
}
Комментариев нет:
Отправить комментарий