Skip to content

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

License

Notifications You must be signed in to change notification settings

hgDendi/ExpandableRecyclerView

Folders and files

NameName
Last commit message
Last commit date

Latest commit

275ded5 · Nov 13, 2017

History

44 Commits
Nov 12, 2017
Nov 5, 2017
Nov 9, 2017
Nov 12, 2017
Nov 12, 2017
Nov 12, 2017
Sep 10, 2017
Nov 13, 2017
Nov 12, 2017
Nov 5, 2017
Sep 10, 2017
Sep 10, 2017
Sep 10, 2017
Sep 13, 2017

Repository files navigation

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/

About

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

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages