How can I implement a Material Design Expand/Collapse List on Android?

后端 未结 2 1659
一个人的身影
一个人的身影 2021-01-31 09:36

I am looking to implement a material list of this style. How can I do this on Android? What classes should I look at? Are there any existing libraries that could make implementi

2条回答
  •  离开以前
    2021-01-31 10:18

    Yes, you can easily implement it with the library SectionedRecyclerViewAdapter. There is a full working example here.

    Basically you create a section class:

    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();
                }
            });
        }
    }
    

    Then you set up the RecyclerView with your sections:

    // 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);
    

提交回复
热议问题