Android-為了靈活使用listView,封裝了BaseAdapter

實現(xiàn)了類似iOS的tableView功能梯影。不用事先創(chuàng)建好所有可能需要的控件巫员,再在運行時動態(tài)判斷顯示或隱藏。極大的提高了效率和減少了代碼量甲棍。

主要功能:

1.可對listView進行分組管理
2.每組都可以設置頭與尾
3.每組的多行可以定義多種布局文件
4.可加載多個布局文件简识,從而可定制頭與尾的布局文件



源碼請點擊github地址下載。IDE使用的是Eclipse感猛。

效果圖如下:

0C5CADD9B0F72C4A98C73866C4EABA34.png

API使用非常簡單七扰,與BaseAdapter的接口類似,按照例子的方法寫很容易實現(xiàn)陪白,demo有兩個界面颈走,從簡單實現(xiàn)到靈活運用。
只需要根據(jù)自己的業(yè)務創(chuàng)建一個Adapter繼承自LXBaseAdapter咱士,然后實現(xiàn)的方法查看LXBaseAdapterInterface接口選擇使用立由。

  • 接口方法如下:
    /**
     * 點擊listView的觸發(fā)方法onItemClick里調(diào)用的接口,區(qū)別點擊的item序厉、頭或尾拆吆,與對應位置
     **/
    public interface LXOnListViewClick {
        public void onItemClick(LXIndexPath idnexPath);
        public void onHeaderClick(int section);
        public void onfooterClick(int section);
    }

    /**
     * 子類必須實現(xiàn)的方法 
     **/
    //返回listview有幾組
    public int getSectionInListView();
    //返回第section組有幾個item行,不包括組頭與組尾
    public int getCountInSection(int section);
    //創(chuàng)建并返回在indexPath位置的item視圖(不要攝入頭尾)
    public View getItemView(LXIndexPath indexPath, View convertView, ViewGroup parent);
    
    
    /**
     * 子類可選實現(xiàn)的方法 
     **/
    /*
     * 下面兩個方法若要實現(xiàn)必須成對實現(xiàn)/
     */
    //定義第section組是否需要顯示頭脂矫。若返回TRUE枣耀,則必須實現(xiàn)下面getHeaderViewInSection方法。
    public boolean showHeaderViewInSection(int section);
    //創(chuàng)建并返回第section組的頭視圖
    public View getHeaderViewInSection(int section, View convertView, ViewGroup parent);

    /*
     * 下面兩個方法若要實現(xiàn)必須成對實現(xiàn)/
     */
    //定義第section組是否需要顯示尾庭再。若返回TRUE捞奕,則必須實現(xiàn)下面getFooterViewInSection方法。
    public boolean showFooterViewInSection(int section);
    //創(chuàng)建并返回第section組的尾視圖
    public View getFooterViewInSection(int section, View convertView, ViewGroup parent);
    
    /*
     * item需要實現(xiàn)多種布局的接口/
     */
    //返回indexPath位置的item類型
    public int getOnlyItemViewType(LXIndexPath indexPath);
    //返回item一共有幾種類型(不包含頭與尾)
    public int getOnlyItemViewTypeCountSum();
    
    
    /**
     * 子類不能復寫的接口
     * */
    //用于item被點擊時傳入position取到對應的indexPath(當row==-1代表為頭視圖拄轻,row==-2代表為尾視圖)
    public LXIndexPath getIndexPathWithPosition(int position, LXOnListViewClick listener);

  • 記錄位置的model

public class LXIndexPath {
    public int row;     //行位置
    public int section; //組位置颅围,(每一組可以包含多行)
}
  • 監(jiān)聽方法:


    在Activity里面監(jiān)聽了listView的點擊事件onItemClick方法,我們需要adapter調(diào)用getIndexPathWithPosition方法才會知道點擊的是item或頭或尾的對應位置恨搓,然后再處理相應的業(yè)務院促。代碼如下:

  adapter.getIndexPathWithPosition(position, new LXOnListViewClick() {
    @Override
    public void onItemClick(LXIndexPath indexPath) {
        Log.e("onItemClick", "indexPath:" + indexPath.section+":"+indexPath.row);
    }
    
    @Override
    public void onHeaderClick(int section) {
        Log.e("onHeaderClick", "section:"+section);
    }
            
    @Override
    public void onfooterClick(int section) {
        Log.e("onfooterClick", "section:"+section);
    }
});
  • 核心代碼:

public abstract class LXBaseAdapter extends BaseAdapter implements
        LXBaseAdapterInterface {

    private LXBaseAdapter subClass;

    // recodeIndexs的子元素是含有三個元素的數(shù)組筏养,第一個元素標記position,第二個元素>0表示為item視圖常拓,TYPE_HEADER表示為頭渐溶,為TYPE_FOOTER表示尾。
    private List<int[]> recodeIndexs = new ArrayList<int[]>();
    private final int TYPE_HEADER = -1;
    private final int TYPE_FOOTER = -2;

    @Override
    public int getCount() {

        /*
         * 設計思路:
         * 
         * 統(tǒng)計返回的視圖的總個數(shù)弄抬。
         * 將每組里面的所有行元素順序加起來就是position值茎辐。
         * 如果有頭試圖或尾視圖,那么position將增加相應的值額外用來展現(xiàn)它們掂恕。 在此函數(shù)返回所有item個數(shù)與頭試圖和尾視圖的總和拖陆。
         * 需要記錄在哪個position位置展現(xiàn)item或頭或尾,因此創(chuàng)建了一個三維數(shù)組recodeIndex[][]用于記錄懊亡。
         * recodeIndex[][0]代表特殊位置的position依啰。
         * recodeIndex[][1]代表(item、頭或尾)視圖所在的組位置
         * recodeIndex[][2]>0表示為item視圖店枣,TYPE_HEADER表示為頭速警,為TYPE_FOOTER表示尾。
         * 
         * */

        int section = subClass.getSectionInListView();
        int count = 0;
        recodeIndexs.clear();
        for (int i = 0; i < section; i++) {

            //判斷有無組頭艰争,若有則記錄位置與類型
            if (getHeaderBool(i) == 1) {
                int[] headerIndex = new int[3];
                headerIndex[0] = count;
                headerIndex[1] = TYPE_HEADER;
                headerIndex[2] = i;
                count++;
                recodeIndexs.add(headerIndex);
            }
            
            //記錄組的行成員
            for (int j = 0; j < subClass.getCountInSection(i); j++) {
                int[] index = new int[3];
                index[0] = count+j;
                index[1] = j;
                index[2] = i;
                recodeIndexs.add(index);
            }
            count += subClass.getCountInSection(i);

            //判斷有無組尾坏瞄,若有則記錄位置與類型
            if (getfooterBool(i) == 1) {
                int[] footerIndex = new int[3];
                footerIndex[0] = count;
                footerIndex[1] = TYPE_FOOTER;
                footerIndex[2] = i;
                recodeIndexs.add(footerIndex);
                count++;
            }
        }

        for (int i = 0; i < recodeIndexs.size(); i++) {
            Log.e("recodeIndex", recodeIndexs.get(i)[0] + "."+recodeIndexs.get(i)[1] + "."+recodeIndexs.get(i)[2]);
        }
        return count;
    }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        
        switch (getItemViewType(position)) {
        case TYPE_HEADER:
            return subClass.getHeaderViewInSection(recodeIndexs.get(position)[2],
                    convertView, parent);

        case TYPE_FOOTER:
            return subClass.getFooterViewInSection(recodeIndexs.get(position)[2],
                    convertView, parent);

        //根據(jù)子類定義的類型種類取得不同布局的item
        default:
            LXIndexPath itemIndexPath = new LXIndexPath();
            itemIndexPath.row = recodeIndexs.get(position)[1];
            itemIndexPath.section = recodeIndexs.get(position)[2];
            return subClass.getItemView(itemIndexPath, convertView, parent);
        }
    }

    @Override
    public int getViewTypeCount() {
        int itemTypeCount = subClass.getOnlyItemViewTypeCountSum();
        return 2 + (itemTypeCount > 0 ? itemTypeCount : 1);
    }

    @Override
    public int getItemViewType(int position) {
        LXIndexPath itemIndexPath = new LXIndexPath();
        itemIndexPath.row = recodeIndexs.get(position)[1];
        itemIndexPath.section = recodeIndexs.get(position)[2];
        
        int type = subClass.getOnlyItemViewType(itemIndexPath);
        if (type > 0) {
            //代表item有多種布局
            return type;
        }
        
        if (itemIndexPath.row >= 0) {
            //代表item只有一種布局
            return 0;
        }
        
        //代表返回頭或尾的布局
        return itemIndexPath.row;
    }

  ......
}


我的github


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市甩卓,隨后出現(xiàn)的幾起案子鸠匀,更是在濱河造成了極大的恐慌,老刑警劉巖逾柿,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缀棍,死亡現(xiàn)場離奇詭異,居然都是意外死亡机错,警方通過查閱死者的電腦和手機爬范,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來弱匪,“玉大人青瀑,你說我怎么就攤上這事∠艚耄” “怎么了斥难?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長帘饶。 經(jīng)常有香客問我哑诊,道長,這世上最難降的妖魔是什么及刻? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任镀裤,我火速辦了婚禮竞阐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘暑劝。我一直安慰自己骆莹,他們只是感情好,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布铃岔。 她就那樣靜靜地躺著汪疮,像睡著了一般峭火。 火紅的嫁衣襯著肌膚如雪毁习。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天卖丸,我揣著相機與錄音纺且,去河邊找鬼。 笑死稍浆,一個胖子當著我的面吹牛载碌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播衅枫,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼嫁艇,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了弦撩?” 一聲冷哼從身側(cè)響起步咪,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎益楼,沒想到半個月后猾漫,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡感凤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年悯周,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片陪竿。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡禽翼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出族跛,到底是詐尸還是另有隱情闰挡,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布庸蔼,位于F島的核電站解总,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏姐仅。R本人自食惡果不足惜花枫,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一刻盐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧劳翰,春花似錦敦锌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至生均,卻和暖如春听想,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背马胧。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工汉买, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人佩脊。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓蛙粘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親威彰。 傳聞我的和親對象是個殘疾皇子出牧,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,185評論 25 707
  • 前言 ListView在Android開發(fā)中十分常見 今天,我將為大家?guī)鞮istView與AdapterView...
    Carson帶你學安卓閱讀 42,619評論 21 216
  • 前言 本文從源碼角度出發(fā)學習listview歇盼,主要分析首次RecycleBin的組成舔痕,layout的過程,滑動過程...
    chefish閱讀 1,412評論 0 6
  • 陽臺上能聞到樓棟里不知哪家廚房飄出陣陣的香味旺遮,偶爾能聽到哪家孩子哭鬧聲赵讯,還有樓下球場的拍打籃球聲。放眼望去耿眉,對...
    夏茉茉閱讀 194評論 0 0
  • 欹窗望盡悲涼月边翼,無邊夜色雨紛紛。二載歷遍心酸難鸣剪,白云千載空余恨组底。遙望春風拂綠柳,臥聽冰河碎夢音筐骇。明朝送我東歸去债鸡,經(jīng)...
    莫言81192閱讀 208評論 0 0