5

Я реализовал расширяемый recyclerview с дочерними элементами, которые являются частью списка. Я последовал за этим code. Вот как это работает:Изменение менеджеров компоновки для разных видов в RecyclerView

Реализация ExpandableListView с использованием RecyclerView кратко описана ниже. В модели списка есть дополнительный параметр «type», который определяет, является ли элемент заголовком или дочерним. Проверяя этот параметр, адаптер раздувает просмотр и просмотрщик, соответствующий типу. Если тип HEADER, он будет раздувать макет элемента заголовка, который содержит TextView и ImageView, для указания того, расширяется ли дочернее дерево или нет.

Теперь, что я хочу сделать, это сделать расширенный макет сеткой. Обычно я делаю это, устанавливая диспетчер компоновки в GridLayoutManager, но в этом случае я использую только один recyclerview, а это значит, что я не могу изменить диспетчер компоновки, не изменяя заголовок, который заканчивается тем, что весь recyclerview превратится в включая заголовки.

Мой вопрос: как бы вы изменили менеджер компоновки только для нескольких макетов внутри адаптера?

Редактировать: Я добавил код.

Recyclerview адаптер:

public class ExpandableListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

// These are constants that are used to determine if the item is a child or a header and is defined with each item from the data model 
public static final int HEADER = 0; 
public static final int CHILD = 1; 

private List<Item> data; 

public ExpandableListAdapter(List<Item> data) { 
    this.data = data; 
} 

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int type) { 
    View view = null; 

    LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    // Check whether the item is a header or child and inflate differnet layouts 
    switch (type) { 
     case HEADER: 
      // Inflate a header layout if the item is a header 
      view = inflater.inflate(R.layout.list_header, parent, false); 
      ListHeaderViewHolder header = new ListHeaderViewHolder(view); 
      return header; 
     case CHILD: 
      // Inflate a child layout if the item is a child 
      view = inflater.inflate(R.layout.list_child, parent, false); 
      ListChildViewHolder child = new ListChildViewHolder(view); 
      return child; 
    } 
    return null; 
} 

public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    final Item item = data.get(position); 

    // Bind different layouts based on if the item is a header or child 
    switch (item.getType()) { 
     case HEADER: 
      // ... 
     case CHILD: 
      // ... 
    } 
} 

@Override 
public int getItemViewType(int position) { 
    return data.get(position).type; 
} 

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

// Viewholder for the header items 
private static class ListHeaderViewHolder extends RecyclerView.ViewHolder { 
    // ... 
} 

// Viewholder for the child items 
private static class ListChildViewHolder extends RecyclerView.ViewHolder { 
    // ... 
} 

И это является основным видом деятельности, где я объявляю менеджер компоновки:

recyclerview = (RecyclerView) findViewById(R.id.recyclerview); 
recyclerview.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)); 

ответ

9

Вы можете изменить менеджер компоновки для GridLayoutManager и определять «размер диапазона» для заголовок, например, если вы хотите, чтобы сетка имела 2 столбца, заголовок должен иметь размер пролета 2 и размер детского пролета 1:

GridLayoutManager glm = new GridLayoutManager(getContext(), 2); 
    glm.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { 
     @Override 
     public int getSpanSize(int position) { 
      switch(getTypeForPosition(position)) { 
       case HEADER: 
        return 2; 
       default: 
        return 1; 
      } 
     } 
    }); 
    recyclerView.setLayoutManager(glm); 

Существует полный пример расширяемой сетки с заголовками here с использованием этого library.

+0

Хорошо, я буду смотреть на эти примеры. – spectre10

+0

Хорошо, как бы реализовать реализованный адаптер с вашей библиотекой? Я создал абстрактный класс, который расширяет RecyclerView.Adapter, и я использую свой обычный адаптер, расширяя этот абстрактный класс. – spectre10

+0

Привет, не могли бы вы создать новый вопрос, чтобы вы могли дать более подробную информацию о том, что вы сделали до сих пор? Можете ли вы лучше объяснить, что вы подразумеваете под «выбираемым» адаптером? Это просто выделить щелчок? – Gustavo

0

изменить менеджер компоновки для GridLayout менеджера и обрабатывать размер диапазона, как указано ниже

layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { 
      @Override 
      public int getSpanSize(int position) { 
       int type=mAdapter.getItemViewType(position); 
       if (type == "view holder type name") 
        return 2; 
       else 
        return 1; 
      } 
     }); 

 Смежные вопросы

  • Нет связанных вопросов^_^