Я реализовал расширяемый 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));
Хорошо, я буду смотреть на эти примеры. – spectre10
Хорошо, как бы реализовать реализованный адаптер с вашей библиотекой? Я создал абстрактный класс, который расширяет RecyclerView.Adapter, и я использую свой обычный адаптер, расширяя этот абстрактный класс. – spectre10
Привет, не могли бы вы создать новый вопрос, чтобы вы могли дать более подробную информацию о том, что вы сделали до сих пор? Можете ли вы лучше объяснить, что вы подразумеваете под «выбираемым» адаптером? Это просто выделить щелчок? – Gustavo