2014-12-11 3 views
45

Так что я пытаюсь сделать, это иметь разнесенный макет, но первый элемент в списке должен охватывать два столбца. Первые две строки также являются фиксированной высотой. У меня все работает, кроме первого элемента, охватывающего два столбца.Пролистайте несколько столбцов с помощью RecyclerView

Я использую RecyclerView.Adapter с помощью StaggeredGridLayoutManager. Не похоже, что это из коробки функциональность. Я предполагаю, что могу создать собственный менеджер макетов, я просто не знаю, с чего начать. Я попытался выполнить поиск, но я не могу найти ничего о том, как получить элементы для размещения нескольких столбцов.

Изображение, приведенное ниже, является тем, что я ищу в списке.

Staggered layout

+0

Вы когда-нибудь находили способ сделать это? –

+0

Первый элемент всегда охватывает две колонки. Я должен был поставить отрицательную правую границу, чтобы получить результаты. Второй элемент - это фиктивный элемент с видимостью, установленной на INVISIBLE. – DDukesterman

+0

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

ответ

49

В настоящее время StaggeredGridLayoutManager поддерживает только виды, которые охватывают все столбцы (для вертикально настроенного макета), а не произвольное число из них.

Если вы все еще хотите, чтобы охватить их всех столбцов, вы должны сделать это в реализации адаптера:

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

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

ИМХО, StaggeredGridLayoutManager все еще находится под сильным развития и Google хочет, чтобы использовать его для обратной связи :(

+0

попытка - getLayoutParams возвращает null. Кому-нибудь повезло? –

+0

@JasonVanAnden, getLayoutParams также возвращал мне нуль. Может быть, мой ответ может вам помочь. – ljmelgui

+0

Хммм, что не должно происходить в то время, когда вызывается 'onBindViewHolder' ... Возможно, у вас есть другая проблема в другом месте, и вы просто обманываете ее. – mato

8

Что я сделал, чтобы охватить все столбцы вертикально сконфигурированной макет был создать новый LayoutParams и установить полный размах истину в реализации адаптера:

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

    StaggeredGridLayoutManager.LayoutParams layoutParams = new StaggeredGridLayoutManager.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); 
    layoutParams.setFullSpan(true); 
    viewHolder.itemView.setLayoutParams(layoutParams); 
}