2015-02-08 11 views
19

Chciałbym wprowadzić materialną listę tego stylu. Jak mogę to zrobić na Androida? Na jakie zajęcia powinienem zajrzeć? Czy istnieją jakieś biblioteki, które mogą ułatwić to wdrożenie?Jak mogę wdrożyć Material Design Expand/Collapse List na Androida?

Material Design Expand/Collapse List

+0

Czy znaleźć rozwiązanie dla tego, co biblioteka nie skończy się za pomocą? Obecnie używam [tego] (https://github.com/HeinrichReimer/material-drawer), ale szukam zwijanych elementów, takich jak zrzuty ekranu – Mendhak

Odpowiedz

1

I wdrożone taką listę przy użyciu tej biblioteki:
expandable-recycler-view

Jest powiązany blog, ale odnosi się do starej wersji:
Expand a RecyclerView in Four Steps

to w zasadzie adapter gdzie możesz podać listę elementów nadrzędnych, które zawierają dzieci. Musisz również określić dwóch posiadaczy dla rodziców i dzieci. Zobacz stronę biblioteki, aby uzyskać więcej informacji.

class MyChild { 
    // add data 
} 
class MyParentListItem implements ParentListItem { 
    private final List<MyChild> mChildren; 

    MyParentListItem(List<MyChild> children) { 
    mChildren = children; 
    // add other data 
    } 

    @Override 
    public List<MyChild> 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<MyParentViewHolder, MyChildViewHolder> { 
    private final LayoutInflater mInflater; 
    public MyExpandableAdapter(List<MyParentListItem> 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 
} 
5

Tak, można go łatwo wdrożyć w bibliotece SectionedRecyclerViewAdapter. Istnieje pełny przykład roboczy: here.

Zasadniczo utworzyć klasę sekcji:

class MySection extends StatelessSection { 

    String title; 
    List<String> list; 
    boolean expanded = true; // true if you want it to be displayed expanded initially 

    public MySection(String title, List<String> 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(); 
      } 
     }); 
    } 
} 

Następnie należy skonfigurować RecyclerView ze swoimi sekcjach:

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