Android ExpandableRecyclerView使用小結

代碼github地址

Android學習交流QQ群:103267029

因為工作需要一個二級樹結構View,所以借鑒ExpandableListView自己寫了個ExpandableRecyclerView。

1.目前只支持兩級結構。
2.支持所有組同時全部展開,支持同一時間只能展開一組。
3.GroupView,ChildView高度自定義。
4.支持初始化數據時,指定展開某組數據。
5.支持GroupItem,ChildItem的Onlick,OnLongClick事件。
6.展開收起帶動畫。

效果圖:


使用步驟:加入依賴

compile 'com.drawthink:expandable-recyclerview:0.0.3'

1.繼承BaseViewHolder,實現自己的ViewHolder

1.1 在構造函數中初始化你的View(包括GroupView,和childView).
1.2 分別實現以下兩個方法,并在對應方法中返回對應Layout布局文件中根節點的ID。
public int getGroupViewResId()

public int getChildViewResId()

示例代碼:

public class ImageViewHolder extends BaseViewHolder {

    public ImageView image;
    public TextView tvTitle;

    /**
     *  初始化你的View(這里包括GroupView,和childView)
     */
    public ImageViewHolder(Context ctx, View itemView, int viewType) {
        super(ctx,itemView, viewType);
        image = (ImageView) itemView.findViewById(R.id.iv_image);
        tvTitle = (TextView)itemView.findViewById(R.id.tv_title);
    }

    /**
     * @return 返回你的GroupView 布局文件中根節點的ID
     */
    @Override
    public int getGroupViewResId() {
        return R.id.group;
    }

    /**
     * @return 返回你的ChildView 布局文件中根節點的ID
     */
    @Override
    public int getChildViewResId() {
        return R.id.child;
    }

}

2.繼承BaseRecyclerViewAdapter<T,S,VH extends BaseViewHolder> ,完成自己的Adapter。

T,SVH各參數見如下注釋

/**
 * author:Drawthink
 * describe:
 * date: 2017/5/22
 * T :group  data
 * S :child  data
 * VH :ViewHolder
 */

public abstract class BaseRecyclerViewAdapter<T,S,VH extends BaseViewHolder> extends RecyclerView.Adapter<VH>

示例Adapter代碼:

public class ImageAdapter extends BaseRecyclerViewAdapter<String,ImageBean,ImageViewHolder> {

    private Context ctx;
    private List datas;
    private LayoutInflater mInflater;

    public ImageAdapter(Context ctx, List<RecyclerViewData> datas) {
        super(ctx, datas);
        mInflater = LayoutInflater.from(ctx);
        this.ctx = ctx;
        this.datas = datas;
    }

    @Override
    public void onBindGroupHolder(ImageViewHolder holder, int groupPos,int position, String groupData) {
        holder.tvTitle.setText(groupData);
    }

    @Override
    public void onBindChildpHolder(ImageViewHolder holder, int groupPos,int childPos,int position, ImageBean childData) {
        holder.image.setBackgroundResource(childData.getResId());
    }

    @Override
    public View getGroupView(ViewGroup parent) {
        return mInflater.inflate(R.layout.title_item_layout,parent,false);
    }

    @Override
    public View getChildView(ViewGroup parent) {
        return mInflater.inflate(R.layout.item_image_layout,parent,false);
    }

    @Override
    public ImageViewHolder createRealViewHolder(Context ctx, View view, int viewType) {
        return new ImageViewHolder(ctx,view,viewType);
    }
}

完成以上兩步之后,基本大工告成,由于ExpandableRecyclerView的數據是要分組的,所以提供了RecyclerViewData來封裝

/**
     * @param groupData
     * @param childDatas
     * @param isExpand   初始化展示數據時,該組數據是否展開
     */
public RecyclerViewData(T groupData, List<S> childDatas,boolean isExpand)

那接下來看下數據具體是怎樣封裝的。

        mDatas = new ArrayList<>();
        List<ImageBean> bean1 = new ArrayList<>();
        List<ImageBean> bean2 = new ArrayList<>();
        List<ImageBean> bean3 = new ArrayList<>();
        // 每個子列表長度可以不相同
        bean1.add(new ImageBean("Dog", R.mipmap.dog));
        bean1.add(new ImageBean("Dog", R.mipmap.dog));
        bean2.add(new ImageBean("Cat", R.mipmap.cat));
        bean3.add(new ImageBean("Bird", R.mipmap.bird));

        mDatas.add(new RecyclerViewData("Dog", bean1, true));
        mDatas.add(new RecyclerViewData("Cat", bean2, true));
        mDatas.add(new RecyclerViewData("Bird", bean3, true));

所有工作以完成,現在你可以象平常使用Adapter,RecyclerView一樣,來愉快的寫代碼了。

注意:在對元數據mDatas進行增刪操作時,要調用adapter.notifyRecyclerViewData();否則會造成數據索引錯亂的問題。
代碼github地址
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,283評論 25 708
  • 這是一列開往你心靈深處的列車。。 鳴笛聲響起,隨著列車由遠而近的駛來,仿佛千軍萬馬般奔騰,車 停下了。就如同,你我...
    凌晨與青春共存閱讀 297評論 0 2
  • (二)復雜在簡單那柔軟的嘴唇里留下了似蜻蜓點水般的吻,簡單不知所措,直到他的吻漸漸越來越深了,她才反應過來,一把他...
    山有在此閱讀 239評論 0 2
  • 真性情與圓滑永遠相悖吧
    托爾西奇閱讀 765評論 0 0