Как создать один адаптер представления переработчика для нескольких держателей просмотра, который соответствует выбранному держателю, не входящему в тот же список представления переработчика - PullRequest
0 голосов
/ 05 июля 2018

Я хотел бы знать, как я могу создать ОДИН адаптер представления переработчика, который содержит несколько держателей представления, и каждый раз, когда RecyclerView создается с этим адаптером, я хочу видеть только определенный тип, а не смешанный тип.

У меня есть 2 разных экрана в действии Android, и на каждом из них отображается список предметов / карточек. Один из них содержит текст и номер, а другой - фотографию. Сейчас у меня есть 2 разных пользовательских адаптера для каждого объекта, и я хочу добиться гибкости одного адаптера, который может откладывать выбор между типами объектов в зависимости от отображаемого экрана и перечислять только нужные мне строки.

Все примеры, которые я видел, относятся к объектам смешанного типа, и это не то, что мне нужно.

Код адаптера прилагается ниже.

    public class MultiAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private ArrayList<MYDataProvider> arrayList;
    private final static int VIEW0 = 0;
    private final static int VIEW1 = 1;

    public MultiAdapter(ArrayList<MyDataProvider> _arrayList) {
        this.arrayList = new ArrayList<>();
        this.arrayList = _arrayList;
    }

    @Override
    public int getItemViewType(int position) {
        switch (position) {
            case 0:
                return VIEW0;

            case 1:
            default:
                return VIEW1;
        }//switch
    }//get item view type

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
        int layoutRes;
        View view;
        RecyclerView.ViewHolder viewholder;

        switch (viewType) {
            case VIEW0:
                layoutRes = R.layout.card_item;
                view = LayoutInflater.from(viewGroup.getContext()).inflate(layoutRes, viewGroup, false);
                viewholder =  new E1(view);
                break;

            case VIEW1:
            default:
                layoutRes = R.layout.item_layout;
                view = LayoutInflater.from(viewGroup.getContext()).inflate(layoutRes, viewGroup, false);
                viewholder =  new E2(view);
                break;
        }//switch

        return viewholder;
    }//on create

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        switch (holder.getItemViewType()) {
            case VIEW0: {
                MyDataProvider mydata = arrayList.get(position);
                ((E1)holder).name1.setText(mydata.getD_name() + "this is item " + position);
                ((E1)holder).imageView1.setImageResource(arrayList.get(position).getImg_res());
            }
            break;

            case VIEW1: {
                MyDataProvider mydata = arrayList.get(position);
                ((E2)holder).name2.setText(mydata.getD_name() + "this is item " + position);
                ((E2)holder).imageView2.setImageResource(arrayList.get(position).getImg_res());
            }
            break;
        }//switch
    }//on bind


    @Override
    public int getItemCount() {
        return arrayList.size();
    }

    public class E1 extends mainViewHolder {
        ImageView imageView1;
        TextView name1;

        public E1(View itemView) {
            super(itemView);
            imageView1 = itemView.findViewById(R.id.image);
            name1 = itemView.findViewById(R.id.d_name);
        }
    }//e1 class

        public class E2 extends mainViewHolder {
        ImageView imageView2;
        TextView name2;

        public E2(View itemView) {
            super(itemView);
            imageView2 = itemView.findViewById(R.id.person_photo);
            name2 = itemView.findViewById(R.id.person_name);
        }
    }//e2 class

    public class mainViewHolder extends RecyclerView.ViewHolder {
        public mainViewHolder(@NonNull View itemView) {
            super(itemView);
        }
    }
}//adapter

Ответы [ 2 ]

0 голосов
/ 06 июля 2018
public class NotificationsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private static final int VIEW_TYPE_REFERRAL_TRIGGER = 1;
    private static final int VIEW_TYPE_NOTIFICATION = 2;
    private static final int VIEW_TYPE_PROMOTION = 3;

    private List<Object> notificationObjectsList;
    private Activity mActivity;

    public NotificationsAdapter(Activity activity, List<Object> mNotificationList) {
        mActivity = activity;
        notificationObjectsList = new ArrayList<>(mNotificationList);
    }


    // Used to avoid the duplicate items recycling
    @Override
    public long getItemId(int position) {
        return position;
    }

    // Used to avoid the duplicate items recycling
    @Override
    public int getItemViewType(int position) {

        if ((notificationObjectsList.get(position) != null) && (notificationObjectsList.get(position) instanceof ReferralData)) {
            return VIEW_TYPE_REFERRAL_TRIGGER;
        } else if (notificationObjectsList.get(position) instanceof Promotion) {
            return VIEW_TYPE_PROMOTION;
        } else {
            return VIEW_TYPE_NOTIFICATION;
        }

    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        switch (viewType) {
            case VIEW_TYPE_REFERRAL_TRIGGER:
                return new NotificationsAdapter.ReferralTriggerViewHolder(inflater.inflate(R.layout.row_referral_trigger, parent, false));
            case VIEW_TYPE_NOTIFICATION:
                return new NotificationsAdapter.UserNotificationViewHolder(inflater.inflate(R.layout.row_layout_user_notification, parent, false));
            case VIEW_TYPE_PROMOTION:
                return new NotificationsAdapter.PromotionViewHolder(inflater.inflate(R.layout.row_layout_app_promotions, parent, false));
            default:
                return new NotificationsAdapter.UserNotificationViewHolder(inflater.inflate(R.layout.row_layout_user_notification, parent, false));
        }

    }

    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder viewHolder, final int position) {

        if (viewHolder instanceof PromotionViewHolder) {
            final PromotionViewHolder promotionViewHolder = (PromotionViewHolder) viewHolder;
            //populate data of promotion view holder

        } else if (viewHolder instanceof UserNotificationViewHolder) {
            final UserNotificationViewHolder notificationViewHolder = (UserNotificationViewHolder) viewHolder;
            //populate data of UserNotificationViewHolder view holder

        } else if (viewHolder instanceof ReferralTriggerViewHolder) {
            final ReferralTriggerViewHolder referralTriggerViewHolder = (ReferralTriggerViewHolder) viewHolder;
            //populate data of ReferralTriggerViewHolder view holder
        }
    }

    @Override
    public int getItemCount() {
        return notificationObjectsList.size();
    }


    private class UserNotificationViewHolder extends RecyclerView.ViewHolder {

        private UserNotificationViewHolder(View itemView) {
            super(itemView);

        }


    }

    private class PromotionViewHolder extends RecyclerView.ViewHolder  {

        private PromotionViewHolder(View itemView) {
            super(itemView);
        }


    }

    private class ReferralTriggerViewHolder extends RecyclerView.ViewHolder {
        ReferralTriggerView referralTriggerView;

        private ReferralTriggerViewHolder(View itemView) {
            super(itemView);
            referralTriggerView = itemView.findViewById(R.id.rtv_notification_adapter);
        }
    }

}
0 голосов
/ 05 июля 2018

Я не понимаю, где твоя проблема? Можете ли вы дать больше объяснений, чего вы хотите достичь?

// редактировать

В своем коде вы определяете, что только первый элемент будет элементом типа VIEW0, а остальные - VIEW1. Это в функции getItemViewType(int position).

Если вы хотите определить, какой ViewHolder выбрать, вы должны выбрать его, прежде чем заполнять список. Создайте enum в вашем адаптере:

enum TYPE {
    VIEW0,
    VIEW1
}

затем создайте переменную enum:

private TYPE itemType;

и передайте его в свой конструктор:

public Test(ArrayList<MyDataProvider> _arrayList, TYPE itemType) {
    this.arrayList = new ArrayList<>();
    this.arrayList = _arrayList;
    this.itemType = itemType;
}

и проверьте, какой у вас тип (на основе переменной itemType) в вашем переключателе в функции onCreateViewHolder. Обратите внимание, что переменная в switch - это itemType, а не viewType из метода переопределения.

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

LayoutInflater inflater = LayoutInflater.from(parent.getContext());
switch (itemType) {
    case VIEW0:
        return new NotificationsAdapter.ReferralTriggerViewHolder(inflater.inflate(R.layout.row_referral_trigger, parent, false));
    case VIEW1:
        return new NotificationsAdapter.UserNotificationViewHolder(inflater.inflate(R.layout.row_layout_user_notification, parent, false));
    default:
        return new NotificationsAdapter.UserNotificationViewHolder(inflater.inflate(R.layout.row_layout_user_notification, parent, false));
}

}
...