如何在Android上实现Material Design展开/折叠列表?

我希望实现这种风格的材料清单。 我怎样才能在Android上执行此操作? 我应该看哪些课程? 是否有任何现有的库可以轻松实现这一点?

材料设计展开/折叠列表

Solutions Collecting From Web of "如何在Android上实现Material Design展开/折叠列表?"

是的,您可以使用库SectionedRecyclerViewAdapter轻松实现它。 这里有一个完整的工作示例。

基本上你创建一个section类:

class MySection extends StatelessSection { String title; List list; boolean expanded = true; // true if you want it to be displayed expanded initially public MySection(String title, List list) { // call constructor with layout resources for this Section header, footer and items super(R.layout.section_header, R.layout.section_item); this.title = title; this.list = list; } @Override public int getContentItemsTotal() { return expanded? list.size() : 0; } @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)); } @Override public RecyclerView.ViewHolder getHeaderViewHolder(View view) { return new SimpleHeaderViewHolder(view); } @Override public void onBindHeaderViewHolder(RecyclerView.ViewHolder holder) { MyHeaderViewHolder headerHolder = (MyHeaderViewHolder) holder; // bind your header view here headerHolder.tvItem.setText(title); // handles the click on the header to toggle the expanded variable 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(); } }); } } 

然后使用您的部分设置RecyclerView:

 // Create an instance of SectionedRecyclerViewAdapter SectionedRecyclerViewAdapter sectionAdapter = new SectionedRecyclerViewAdapter(); // Create your sections with the list of data for each topic MySection topic1Section = new MySection("Attractions", attractionsList); MySection topic2Section = new MySection("Dining", diningList); // Add your Sections to the adapter sectionAdapter.addSection(topic1Section); sectionAdapter.addSection(topic2Section); // Set up your RecyclerView with the SectionedRecyclerViewAdapter RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview); recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); recyclerView.setAdapter(sectionAdapter); 

我使用这个库实现了这样一个列表:
膨胀-回收视

有一个相关的博客,但它指的是旧版本:
通过四个步骤扩展RecyclerView

它基本上是一个适配器,您可以在其中提供包含子元素的父元素列表。 您还必须为父母和孩子指定两个持有人。 有关详细信息,请参阅库的页面。

 class MyChild { // add data } class MyParentListItem implements ParentListItem { private final List mChildren; MyParentListItem(List children) { mChildren = children; // add other data } @Override public List getChildItemList() { return mChildren; } @Override public boolean isInitiallyExpanded() { return false; } } class MyParentViewHolder extends ParentViewHolder { MyParentViewHolder(View itemView) { super(itemView); // get other views with itemView.findViewById(..); } } class MyChildViewHolder extends ChildViewHolder { MyParentViewHolder(View itemView) { super(itemView); // get other views with itemView.findViewById(..); } } public class MyExpandableAdapter extends ExpandableRecyclerAdapter { private final LayoutInflater mInflater; public MyExpandableAdapter(List parentItemList, Context context) { super(parentItemList); mInflater = LayoutInflater.from(context); } @Override public MyParentViewHolder onCreateParentViewHolder(ViewGroup parentViewGroup) { final View itemView = mInflater.inflate(R.layout.parent_layout, parentViewGroup, false); return new MyParentViewHolder(itemView); } @Override public MyChildViewHolder onCreateChildViewHolder(ViewGroup childViewGroup) { final View itemView = mInflater.inflate(R.layout.child_layout, childViewGroup, false); return new MyChildViewHolder(itemView); } // bind data to holders in the onBind methods }