ExpandableListView兩級列表的BaseExpandableListAdapter封裝

public abstract class MyBaseExpandableAdapter<P, C> extends BaseExpandableListAdapter {
    protected Context mContext;
    protected List<P> mParentList;
    protected List<List<C>> mChildList;
    protected int mParentLayout;
    protected int mChildLayout;

    /**
     * 參數(shù)過多,使用構(gòu)造者模式肪虎?
     */
    public MyBaseExpandableAdapter(Context mContext, List<P> mParentList, List<List<C>> mChildList, int parentLayout,
                                   int childLayout) {
        this.mContext = mContext;
        this.mParentList = mParentList;
        this.mChildList = mChildList;
        this.mParentLayout = parentLayout;
        this.mChildLayout = childLayout;
    }

    public abstract void convertParent(ViewHolder holder, P p, int groupPosition, boolean isExpanded);

    public abstract void convertChild(ViewHolder holder, P p, C c, int groupPosition, int childPosition, boolean isLastChild);

    @Override
    public int getGroupCount() {
        return mParentList == null ? 0 : mParentList.size();
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        return (mChildList == null || mChildList.size() <= groupPosition || mChildList.get(groupPosition) == null) ?
                0 : mChildList.get(groupPosition).size();
    }

    @Override
    public Object getGroup(int groupPosition) {
        return mParentList == null ? null : mParentList.get(groupPosition);
    }

    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return (mChildList == null || mChildList.size() <= groupPosition || mChildList.get(groupPosition) == null) ?
                null : mChildList.get(groupPosition).get(childPosition);
    }

    @Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }

    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }

    @Override
    public boolean hasStableIds() {
        return false;
    }

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        ViewHolder holder = ViewHolder.getInstance(mContext, convertView, mParentLayout);
        convertParent(holder, mParentList.get(groupPosition), groupPosition, isExpanded);
        return holder.getConvertView();
    }

    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        ViewHolder holder = ViewHolder.getInstance(mContext, convertView, mChildLayout);
        convertChild(holder, mParentList.get(groupPosition), mChildList.get(groupPosition).get(childPosition), groupPosition, childPosition, isLastChild);
        return holder.getConvertView();
    }

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true; // 子列表可以點擊
    }

}

ViewHolder

/**
 * 適配器通用的ViewHolder,而且 BaseAdapter 和 BaseExpandableListAdapter 都可以用
 */

public class ViewHolder {

    private View convertView;
    private SparseArray<View> views; // SparseArray效率比HashMap更高

    private ViewHolder(View convertView) {
        this.views = new SparseArray<>();
        this.convertView = convertView;
        convertView.setTag(this);
    }

    public static ViewHolder getInstance(Context context, View convertView, int layout) {
        if (convertView == null) {
            convertView = LayoutInflater.from(context).inflate(layout, null);
            return new ViewHolder(convertView);
        }
        return (ViewHolder) convertView.getTag(); // 重用convertView的邏輯
    }

    public <T extends View> T findViewById(int id) {
        View view = views.get(id);
        if (view == null) {
            view = convertView.findViewById(id);
            views.append(id, view);
        }
        return (T) view;
    }

    public View getConvertView() {
        return convertView;
    }
}
使用方式:
public class TodaySignAdapter extends MyBaseExpandableAdapter<SignGroup, Record> {  
  
    public TodaySignAdapter(List<List<Record>> childLists, List<SignGroup> parentList, Context context) {  
        super(context, parentList, childLists,  
                R.layout.expandable_list_today_group, R.layout.expandable_list_today_child);  
    }  
  
    @Override  
    public void convertParent(ViewHolder holder, SignGroup signGroup, int groupPosition, boolean isExpanded) {  
        ImageView groupArrow = holder.findViewById(R.id.iv_group_arrow);  
        ImageView groupImage = holder.findViewById(R.id.iv_sign_group);  
        TextView signInfo = holder.findViewById(R.id.tv_sign_info);  
        TextView locationName = holder.findViewById(R.id.tv_sign_location_name);  
  
        signInfo.setText("打卡" + signGroup.signCount + "次/" + signGroup.duration);  
        locationName.setText(signGroup.locationName);  
        groupArrow.setImageResource(isExpanded ? R.mipmap.arrow_o : R.mipmap.arrow_n);  
        ImageLoader.getInstance().displayImage(URLs.HEAD_URL + signGroup.fileName, groupImage);  
    }  
  
    @Override  
    public void convertChild(ViewHolder holder, SignGroup signGroup, Record record, int groupPosition, int childPosition, boolean isLastChild) {  
        ImageView childImage = holder.findViewById(R.id.iv_sign_file_name);  
        TextView dateSign = holder.findViewById(R.id.tv_sign_date);  
  
        ImageLoader.getInstance().displayImage(URLs.HEAD_URL + record.getFileName(), childImage);  
        dateSign.setText(TimeTransferUtil.getTime(Long.parseLong(record.getDateSign())));  
    }  
  
}  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子匈棘,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捅儒,死亡現(xiàn)場離奇詭異煤禽,居然都是意外死亡铐达,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門檬果,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瓮孙,“玉大人,你說我怎么就攤上這事汁汗≈云瑁” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵知牌,是天一觀的道長祈争。 經(jīng)常有香客問我,道長角寸,這世上最難降的妖魔是什么菩混? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮扁藕,結(jié)果婚禮上沮峡,老公的妹妹穿的比我還像新娘。我一直安慰自己亿柑,他們只是感情好邢疙,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著望薄,像睡著了一般疟游。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上痕支,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天颁虐,我揣著相機與錄音,去河邊找鬼卧须。 笑死另绩,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的花嘶。 我是一名探鬼主播笋籽,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼察绷!你這毒婦竟也來了干签?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤拆撼,失蹤者是張志新(化名)和其女友劉穎容劳,沒想到半個月后喘沿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡竭贩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年蚜印,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片留量。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡窄赋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出楼熄,到底是詐尸還是另有隱情忆绰,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布可岂,位于F島的核電站错敢,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏缕粹。R本人自食惡果不足惜稚茅,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望平斩。 院中可真熱鬧亚享,春花似錦、人聲如沸绘面。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽揭璃。三九已至魄衅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間塘辅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工皆撩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留扣墩,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓扛吞,卻偏偏與公主長得像呻惕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子滥比,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容