Как реализовать расширяемые элементы с LinearLayoutManager (представленный с Android L)

RecyclerView был представлен с Android L и является частью библиотеки AppCompat v7. Затем я решил обновить мое приложение с помощью этого нового RecyclerView чтобы заменить ListView . Для этого, когда дело доходит до установки LayoutManager для RecyclerView , я использую LinearLayoutManager , который отлично работает.

Вот тяжелые вещи: когда я хочу изменить свой ExpandableListView на RecyclerView . Поскольку Google не создал « ExpandableLayoutManager », это довольно сложно, и я не могу этого добиться.

В документации упоминаются дети, но, похоже, это дети корневого представления RecyclerView не сами дети.

У кого-то есть обходное решение или некоторые подсказки? Или, по крайней мере, некоторую информацию, например, где начать, чтобы я мог реализовать свой собственный LayoutManager .

Благодаря,

Solutions Collecting From Web of "Как реализовать расширяемые элементы с LinearLayoutManager (представленный с Android L)"

Эта библиотека помогает вам группировать элементы в «разделы», и затем вы можете реализовать функции expand / collapse, приведенные в этом примере .

Сначала вы создаете класс раздела:

 class MySection extends StatelessSection { String header; List<String> list; boolean expanded = true; public MySection(String header, List<String> list) { // call constructor with layout resources for this Section header and items super(R.layout.section_header, R.layout.section_item); this.myHeader = header; this.myList = list; } @Override public int getContentItemsTotal() { return expanded? list.size() : 0; } @Override public RecyclerView.ViewHolder getHeaderViewHolder(View view) { return new HeaderViewHolder(view); } @Override public void onBindHeaderViewHolder(RecyclerView.ViewHolder holder) { final HeaderViewHolder headerHolder = (HeaderViewHolder) holder; headerHolder.tvTitle.setText(title); headerHolder.rootView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { expanded = !expanded; headerHolder.imgArrow.setImageResource( expanded ? R.drawable.ic_keyboard_arrow_up_black_18dp : R.drawable.ic_keyboard_arrow_down_black_18dp ); sectionAdapter.notifyDataSetChanged(); } }); } @Override public RecyclerView.ViewHolder getItemViewHolder(View view) { // return a custom instance of ViewHolder for the items of this section return new MyItemViewHolder(view); } @Override public void onBindItemViewHolder(RecyclerView.ViewHolder holder, int position) { MyItemViewHolder itemHolder = (MyItemViewHolder) holder; // bind your view here itemHolder.tvItem.setText(list.get(position)); } } 

Затем создайте экземпляр ваших разделов и настройте свой адаптер:

 // Create an instance of SectionedRecyclerViewAdapter SectionedRecyclerViewAdapter sectionAdapter = new SectionedRecyclerViewAdapter(); // Add your Sections sectionAdapter.addSection(new MySection("Section 1", Arrays.asList(new String[] {"Item 1", "Item 2", "Item 3", "Item 4" }))); sectionAdapter.addSection(new MySection("Section 2", Arrays.asList(new String[] {"Item 1", "Item 2" }))); // Set up your RecyclerView with the SectionedRecyclerViewAdapter RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview); recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); recyclerView.setAdapter(sectionAdapter);