ExpandableRecyclerView

Customized recyclerViewAdapter which shows items in a 2-level list.

Github stars Tracking Chart

ExpandableRecyclerView

【中文README】

Customized recyclerViewAdapter which shows items in a 2-level list.

demo

It encapsulates the expand and fold operation in abstract class BaseExpandableListAdapter,which makes it flexible.

See the usage below , all you need to do is just extending the class and overriding these 6 methods:

  • getGroupCount
  • getGroupItem
  • onCreateGroupViewHolder
  • onCreateChildViewHolder
  • onBindGroupViewHolder
  • onBindChildViewHolder

As onCreateViewHolder & onBindViewHolder are compulsive methods which need developers to override. All your extra work is overriding getGroupCount & getGroupPosition. In most conditions , it is just a one-line-method.

Gradle

dependencies{
	compile 'com.hgDendi:expandable-recyclerview-adapter:1.0.1'
}

Usage

// !!Notice the generics here
public class SampleAdapter extends BaseExpandableRecyclerViewAdapter
<SampleGroupBean, SampleChildBean, SampleAdapter.GroupVH, SampleAdapter.ChildVH>

    @Override
    public int getGroupCount() {
        //return the size of group
    }

    @Override
    public GroupBean getGroupItem(int groupIndex) {
        //return the bean according to the groupIndex
    }

    @Override
    public GroupVH onCreateGroupViewHolder(ViewGroup parent, int groupViewType) {
    }

    @Override
    public ChildVH onCreateChildViewHolder(ViewGroup parent, int childViewType) {
    }

    @Override
    public void onBindGroupViewHolder(GroupVH holder, SampleGroupBean sampleGroupBean, boolean isExpand) {
    }

    @Override
    public void onBindChildViewHolder(ChildVH holder, SampleGroupBean sampleGroupBean, int childIndex) {
    }
}

Relating classes:

class SampleGroupBean implements BaseExpandableRecyclerViewAdapter.BaseGroupBean<SampleChildBean> {
    @Override
    public int getChildCount() {
        return mList.size();
    }

    // whether this group is expandable
    @Override
    public boolean isExpandable() {
        return getChildCount() > 0;
    }
  
  	@Override
    public SampleChildBean getChildAt(int index) {
        return mList.size() <= index ? null : mList.get(index);
    }
}

public class SampleChildBean {
}

static class GroupVH extends BaseExpandableRecyclerViewAdapter.BaseGroupViewHolder {
    GroupVH(View itemView) {
        super(itemView);
    }

    // this method is used for partial update.Which means when expand status changed,only a part of this view need to invalidate
    @Override
    protected void onExpandStatusChanged(RecyclerView.Adapter relatedAdapter, boolean isExpanding) {
    }
}

static class ChildVH extends RecyclerView.ViewHolder {
    ChildVH(View itemView) {
        super(itemView);
        nameTv = (TextView) itemView.findViewById(R.id.child_item_name);
    }
}

ExtraUsage

SetListener

Use Adapter#setListener() to add Callback

public interface ExpandableRecyclerViewOnClickListener<GroupBean extends BaseGroupBean, ChildBean> {
    /**
    * called when group item is long clicked
    *
    * @param groupItem
    * @return
    */
    boolean onGroupLongClicked(GroupBean groupItem);

    /**
    * called when an expandable group item is clicked
    *
    * @param groupItem
    * @param isExpand
    * @return whether intercept the click event
    */
    boolean onInterceptGroupExpandEvent(GroupBean groupItem, boolean isExpand);

    /**
    * called when an unexpandable group item is clicked
    *
    * @param groupItem
    */
    void onGroupClicked(GroupBean groupItem);

    /**
    * called when child is clicked
    *
    * @param groupItem
    * @param childItem
    */
    void onChildClicked(GroupBean groupItem, ChildBean childItem);
}

ShowEmptyView

Show empty view when list is empty.

adapter.setEmptyViewProducer(new ViewProducer() {
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent) {
        View emptyView = LayoutInflater.from(parent.getContext()).inflate(R.layout.empty, parent, false);
        return new DefaultEmptyViewHolder(emptyView);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder) {
    }
});

VariousGroup&Child

Override getGroupType & getChildType.

Override onCreateViewHolder to generate different ViewHolder.(The same as original RecyclerViewAdapter)

protected int getGroupType(GroupBean groupBean) {
    return 0;
}

abstract public GroupViewHolder onCreateGroupViewHolder(ViewGroup parent, int groupViewType);
    
protected int getChildType(GroupBean groupBean, ChildBean childBean) {
    return 0;
}

abstract public ChildViewHolder onCreateChildViewHolder(ViewGroup parent, int childViewType);

AddHeaderView

adapter.setEmptyViewProducer(new ViewProducer() {
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent) {
        View emptyView = LayoutInflater.from(parent.getContext()).inflate(R.layout.header, parent, false);
        return new DefaultEmptyViewHolder(emptyView);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder) {
    }
},false);

License

MIT

https://rem.mit-license.org/

Main metrics

Overview
Name With OwnerhgDendi/ExpandableRecyclerView
Primary LanguageJava
Program languageJava (Language Count: 1)
Platform
License:MIT License
所有者活动
Created At2017-09-10 13:09:35
Pushed At2017-11-13 14:54:37
Last Commit At2017-11-13 22:54:03
Release Count0
用户参与
Stargazers Count372
Watchers Count6
Fork Count40
Commits Count44
Has Issues Enabled
Issues Count18
Issue Open Count13
Pull Requests Count0
Pull Requests Open Count0
Pull Requests Close Count0
项目设置
Has Wiki Enabled
Is Archived
Is Fork
Is Locked
Is Mirror
Is Private