Страницы

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

среда, 5 февраля 2020 г.

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

#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; ... } и в адатер передавай список этих итемов. и тогда сможешь один адаптер для нескольких юзать.

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

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