Tutorial
Just looking for a sample code?
Tutorial¶
Step 1. Extend AbstractExpandableItemAdapter
instead of RecyclerView.Adapter
¶
First, you need to extend AbstractExpandableItemAdapter
to use expandable items feature. This class implements RecyclerView.Adapter
's methods and some of them are sealed via final
keyword. Instead, it provides some Group
/ Child
prefixed version of RecyclerView.Adapter
methods.
class MyChildItem {
public long id;
}
class MyGroupItem {
public long id;
List<MyChildItem> children;
}
class MyAdapter extends AbstractExpandableItemAdapter<MyAdapter.MyGroupVH, MyAdapter.MyChildVH> {
List<MyGroupItem> items;
public MyAdapter() {
setHasStableIds(true); // this is required for expandable feature.
}
@Override
public int getGroupCount() { ... }
@Override
public int getChildCount(int groupPosition) { ... }
@Override
public long getGroupId(int groupPosition) { ... }
@Override
public long getChildId(int groupPosition, int childPosition) { ... }
@Override
public MyGroupVH onCreateGroupViewHolder(ViewGroup parent, int viewType) { ... }
@Override
public MyChildViewHolder onCreateChildViewHolder(ViewGroup parent, int viewType) { ... }
@Override
public void onBindGroupViewHolder(MyGroupVH holder, int groupPosition, int viewType) { ... }
@Override
public void onBindChildViewHolder(MyChildViewHolder holder, int groupPosition, int childPosition, int viewType) { ... }
@Override
public boolean onCheckCanExpandOrCollapseGroup(MyGroupVH holder, int groupPosition, int x, int y, boolean expand) { ... }
}
Step 2. Implement each method of AbstractExpandableItemAdapter
¶
Step 3. Implement getGroupCount()
/ getChildCount()
¶
The corresponding RecyclerView.Adapter
's method is getItemCount()
.
@Override
public int getGroupCount() {
return items.size();
}
@Override
public int getChildCount(int groupPosition) {
reuturn items.get(groupPosition).size();
}
Step 4. Implement getGroupId()
/ getChildId()
¶
The corresponding RecyclerView.Adapter
's method is getItemId()
.
@Override
public int getGroupId(int groupPosition) {
return items.get(groupPosition).id;
}
@Override
public int getChildId(int groupPosition, int childPosition) {
reuturn items.get(groupPosition).children.get(childPosition).id;
}
Step 5. Implement onCreateGroupViewHolder()
/ onCreateChildViewHolder()
¶
The corresponding RecyclerView.Adapter
's method is onCreateViewHolder()
.
@Override
public MyGroupVH onCreateGroupViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInfrater.from(parent.getContext()).inflate(R.layout.item_group, parent, false);
return new MyGroupVH(v);
}
@Override
public MyChildViewHolder onCreateChildViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInfrater.from(parent.getContext()).inflate(R.layout.item_child, parent, false);
return new MyChildVH(v);
}
Step 6. Implement onBindGroupViewHolder()
/ onBindChildViewHolder()
¶
The corresponding RecyclerView.Adapter
's method is onBindViewHolder()
.
@Override
public void onBindGroupViewHolder(MyGroupVH holder, int groupPosition, int viewType) {
MyGroupItem item = items.get(groupPosition);
holder.text.setText(...);
}
@Override
public void onBindChildViewHolder(MyChildViewHolder holder, int groupPosition, int childPosition, int viewType) {
MyChildItem item = items.get(groupPosition).children.get(childPosition);
holder.text.setText(...);
}
Step 7. Implement onCheckCanExpandOrCollapseGroup()
¶
Just returns true
for make group items automatically respond to click events.
@Override
public boolean onCheckCanExpandOrCollapseGroup(MyGroupViewHolder holder, int groupPosition, int x, int y, boolean expand) {
return true;
}
[Tip] If you want to handle expand/colappse action manually
Make this method reutrns false
. Then call RecyclerViewExpandableItemManager.expandGroup()
/ collapseGroup()
on click item events.
» Sample code: AddRemoveExpandableExampleAdapter#handleOnClickGroupItemContainerView()
» Related issue: Force expand/colapse #11
Step 8. Custom more and details of the implementation¶
Please refer to the demo app implementation for more details.