FirebaseRecyclerAdapter и умножение типов элементов на Android

Я хочу добавить 2 типа:-

  1. с изображением
  2. без изображения

в моем recyclerview, Я знаю, что мне нужно переопределить метод из FirebaseRecyclerAdapter но я не знаю как. Помогите мне пожалуйста с этим.

@Override
public int getItemViewType(int position) {
    return mModelLayout;
}


abstract protected void populateViewHolder(VH viewHolder, T model, int position);

Поэтому я хочу получить тип элемента T-модели через int (1 - с изображением, 2 - без) и изменить mModelLayout, основываясь на этой информации. Могу ли я просто добавить, если еще заявление там?

3 ответа

Этот ответ основан на ответе хатбойсама. Мне понадобились целые годы, чтобы понять, как все сочетается друг с другом, поэтому я решил подробно описать решение здесь:

    mRecyclerViewAdapter = new FirebaseRecyclerAdapter<DataObjectModel, ViewHolder>(
            DataObjectModel.class, R.layout.defaultitem_layout, ViewHolder.class, mDatabaseRef) {

        @Override
        public void populateViewHolder(ViewHolder viewholder, final DataObjectModel dataobject, int position) {

            if (getItemViewType(position) == R.layout.my_image_item){
                viewholder.setName(dataobject.getName()); 
            }
            else if (getItemViewType(position) == R.layout.my_no_image_item{
                viewholder.setText(dataobject.getText());
        }


        @Override
        public int getItemViewType(int position) {
            DataObjectModel dataobject = getItem(position);
            if (dataobject.getType() != null && dataobject.getType().equals("image")) {
                // Layout for an item with an image
                return  R.layout.my_image_item);
            } else if (dataobject.getType() != null && dataobject.getType().equals("noimage")) {
                // Layout for an item without an image
                return  R.layout.my_no_image_item;
            }
        }
    };

// getName () и setText() - это методы, которые вы должны написать в "открытом статическом классе. ChatHolder extends RecyclerView.ViewHolder"

// Вот класс ViewHolder для хорошей меры

    public static class ViewHolder extends RecyclerView.ViewHolder {
        View mView;

        public ViewHolder (View itemView) {
            super(itemView);
            mView = itemView;
        }

        public void setName(String name) {
            TextView field = (TextView) mView.findViewById(R.id.name_text);
            field.setText(name);
        }

        public void setText(String text) {
            TextView field = (TextView) mView.findViewById(R.id.message_text);
            field.setText(text);
        }
}

Вы должны переопределить getItemViewType метод, чтобы вернуть идентификатор ресурса для макета, который вы хотите загрузить. Как это:

@Override
public int getItemViewType(int position) {
    if (hasImage(position)) {
        // Layout for an item with an image
        return R.layout.my_image_item;
    } else {
        // Layout for an item without an image
        return R.layout.my_no_image_item;
    }
}

Это приведет к onCreateViewHolder раздувать правильный макет для каждого элемента. Ваш класс ViewHolder должен быть в состоянии обрабатывать оба типа элементов. Затем в populateViewHolder Вы можете заполнить соответствующие представления на основе позиции элемента.

Попробуйте сделать это Override.

mAdapter = new FirebaseRecyclerAdapter<Post, PostViewHolder>(options) {

    @Override
    public int getItemViewType(int position) {
        return super.getItemViewType(position);
    }

Я нашел ответ на этом сайте.

 mAdapter = new FirebaseRecyclerAdapter<User, RecyclerView.ViewHolder>(
            User.class, R.layout.item_user, RecyclerView.ViewHolder.class, ref) {
        @Override
        protected void populateViewHolder(final RecyclerView.ViewHolder viewHolder, final User user,
                                          final int position) {
            switch (user.getType()) {
                case Constants.USER_TYPE_1:
                    populateType1((ViewHolder1) viewHolder, user, position);
                    break;
                case Constants.USER_TYPE_2:
                    populateType2((ViewHolder2) viewHolder, user, position);
                    break;
                case Constants.USER_TYPE_3:
                    populateType3((ViewHolder3) viewHolder, user, position);
                    break;
            }
        }

        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            switch (viewType) {
                case USER_TYPE_1:
                    View userType1 = LayoutInflater.from(parent.getContext())
                            .inflate(R.layout.item_type1, parent, false);
                    return new ViewHolder1(userType1);
                case USER_TYPE_2:
                    View userType2 = LayoutInflater.from(parent.getContext())
                            .inflate(R.layout.item_type2, parent, false);
                    return new ViewHolder2(userType2);
                case USER_TYPE_3:
                    View userType3 = LayoutInflater.from(parent.getContext())
                            .inflate(R.layout.item_type3, parent, false);
                    return new ViewHolder3(userType3);
            }
            return super.onCreateViewHolder(parent, viewType);
        }

        @Override
        public int getItemViewType(int position) {
            User user = getItem(position);
            switch (user.getType()) {
                case Constants.USER_TYPE_1:
                    return USER_TYPE_1;
                case Constants.USER_TYPE_2:
                    return USER_TYPE_2;
                case Constants.USER_TYPE_3:
                    return USER_TYPE_3;
            }
            return super.getItemViewType(position);
        }
    };
Другие вопросы по тегам