Gridlayoutmanager с расположением 2х1

Я пытаюсь сделать пользовательский интерфейс, подобный следующему, используя gridlayoutmanager в представлении переработчика:

+ ------- + + ------- +
| | | |
| | | |
| | | |
+ ------- + + ------- +
+ ----------------- +
| |
| |
+ ----------------- +

Я корректирую ширину в onBindViewHolder здесь:

int mode = (position+1)%4;
        int h_mul = 1, w_mul = 1;
        switch (mode){
            case 0:
                h_mul = w_mul = 2;
                break;
            case 2:
                w_mul = 2;
                break;
            case 3:
            case 1:
            default:
                h_mul = w_mul = 1;
                break;
        }
        mCardView.getLayoutParams().height = h_mul * mContext.getResources().getInteger(R.integer.video_tile_height);
        mCardView.getLayoutParams().width = w_mul * mContext.getResources().getInteger(R.integer.video_tile_width);

Я попробовал несколько подходов: 1. Горизонтальный gridlayoutmanager с setSpanSizeLookup:

    manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
        @Override
        public int getSpanSize(int position) {
            int mode = (position+1)%4;
            switch (mode){
                case 0:
                case 2:
                    return manager.getSpanCount();
                case 3:
                case 1:
                    return 1;
                default:
                    return -1;
            }
        }
    });

Что я в конечном итоге это:

+ ------------ + + ----------------------------- + + ---- -------- +
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
+ ------------ + + ----------------------------- + + ---- -------- +

Если я не установил span, то это закончится так:

+ ------------ + + --------------- +
| | | |
| | | |
| | | |
| | | |
| | | |
+ ------------ + + --------------- +

+ --------------------------- +
| |
| |
| |
| |
| |
+ --------------------------- +
  1. Горизонтальная шахматная решетка Если это использование

     StaggeredGridLayoutManager.LayoutParams layoutParams = (StaggeredGridLayoutManager.LayoutParams) holder.itemView.getLayoutParams();
            layoutParams.setFullSpan(true);
    

Тогда это становится таким же, как

+ ------------ + + ----------------------------- + + ---- -------- +
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
+ ------------ + + ----------------------------- + + ---- -------- +

Если я изначально не использую полный диапазон, то это идеально, но если я прокручиваю окно просмотра, оно становится таким же, как указано выше:

+ ------------ + + ----------------------------- + + ---- -------- + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | + ------------ + + ----------------------------- + + ---- -------- +

Я не понимаю, что является причиной этого. Может кто-нибудь указать, какую ошибку я могу сделать?

1 ответ

Решение

Вы хотите получить горизонтальный вид переработчика, где у вас есть повторение этих трех коробок. Но ваш подход к рассмотрению этих 3 блоков как отдельного предмета для вторичной переработки не позволит вам прокручивать их в группе. Что вам нужно сделать, это определить отдельный макет, который содержит эти 3 поля в нем. Затем вы предоставляете данные для 3 элементов и связываете их в держателе представления.

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

public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    if (viewType == GROUP_ITEM) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.group_item, parent, false);
        return new GroupViewHolder(view);
    } else if (viewType == SINGLE_ITEM) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.single_item, parent, false);
        return new SingleViewHolder(view);
    }

    return null;
}

public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    if (holder instanceof GroupViewHolder) {
        ((GroupViewHolder) holder).populateData(position);
    } else if (holder instanceof SingleViewHolder) {
      // populate your normal view.
    }
}

Другие вопросы по тегам