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, то это закончится так:
+ ------------ + + --------------- + | | | | | | | | | | | | | | | | | | | | + ------------ + + --------------- + + --------------------------- + | | | | | | | | | | + --------------------------- +
Горизонтальная шахматная решетка Если это использование
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.
}
}