Android 控件之 ListView

Android 控件之 ListView

ListView 是 Android 系統(tǒng)中最常使用的的控件之一——因?yàn)槭謾C(jī)屏幕的面積有限贯被,很難顯示足夠的內(nèi)容,所以需要滾動(dòng)顯示儿捧。ListView 允許用戶通過手指上下滑動(dòng)的方式將屏幕外的數(shù)據(jù)滾動(dòng)到屏幕中破喻,同時(shí)屏幕中已有的內(nèi)容則會(huì)滾出屏幕盖灸。

通常來說,ListView 的使用應(yīng)該包含以下幾個(gè)步驟:

  • 在 layout 中準(zhǔn)備需要使用 ListView 的地方
  • 準(zhǔn)備需要在 ListView 中顯示的數(shù)據(jù)
  • 準(zhǔn)備適配器(包括上下文届囚,使用的樣式有梆,要填充的數(shù)據(jù))
  • 將適配器裝載入 ListView
ArrayAdapter<String> adapter = new ArrayAdapter<String>(Activity.this, android.R.layout.simple_list_item_1, data);
listView.setAdapter(adapter);

其中的 Activity.this 指定了上下文,android.R.layout.simple_list_item_1 指定了要使用的子項(xiàng)布局 id意系,最后一項(xiàng) data 就是要加載的數(shù)據(jù)泥耀。

準(zhǔn)備好適配器后,直接使用 ListView 的 setAdapter 方法加載適配器即可蛔添。

適配器界面的定制

要定制一個(gè)適配器痰催,一般分為以下幾個(gè)步驟:

  • 定義一個(gè)類作為適配器的適配類型
  • 準(zhǔn)備一個(gè)想要的布局
  • 自定義一個(gè)適配器類,且在其中實(shí)現(xiàn) getView 方法
  • 準(zhǔn)備適配器(包括上下文迎瞧,使用的樣式夸溶,要填充的數(shù)據(jù))
  • 將適配器裝載入 ListView
public class FruitAdapter extends ArrayAdapter<Fruit> {
    private int resourceId;
    
    public FruitAdapter(Context context, int textViewResourceId, List<Fruit> objects) {
        super(context, textViewResourceId, objects);
        resourceId = textViewResourceId;
    }
    
    @Override
    public View getView(int postion, View convertView, ViewGroup parent){
        Fruit fruit = getItem(postion);
        View view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false);
        ...
        return view;
    }
}

在以上的代碼中,首先重寫了父類的構(gòu)造函數(shù)凶硅,將 ListView 的子項(xiàng)布局傳遞進(jìn)來缝裁。然后重寫了 getView 方法,這個(gè)方法在每一個(gè) ListView 子項(xiàng)從屏幕外滾動(dòng)到屏幕內(nèi)時(shí)都會(huì)被調(diào)用足绅。在這個(gè)方法中捷绑,首先調(diào)用 getItem 方法獲得當(dāng)前數(shù)據(jù)的實(shí)例韩脑,然后使用 LayoutInflater 為這個(gè)子項(xiàng)加載傳入的布局。

LayoutInflater 的 inflate() 方法接收 3 個(gè)參數(shù)粹污,第一個(gè)參數(shù)是上下文段多,第二個(gè)參數(shù)是要使用的布局 id,第三個(gè)參數(shù) false 是指表示只讓我們?cè)诟覆季种新暶鞯?layout 屬性生效壮吩,單是不為這個(gè) view 添加父布局进苍。因?yàn)?view 一旦擁有父布局以后,就再不能添加到 ListView 中粥航。

提升效率

按照之前的方法琅捏,每當(dāng)加載一個(gè)子項(xiàng)時(shí),都需要重新加載一次布局递雀。getView 方法中的 convertView 參數(shù)柄延,就可以用于解決這一問題:

public class FruitAdapter extends ArrayAdapter<Fruit> {
    private int resourceId;
    
    public FruitAdapter(Context context, int textViewResourceId, List<Fruit> objects) {
        super(context, textViewResourceId, objects);
        resourceId = textViewResourceId;
    }
    
    @Override
    public View getView(int postion, View convertView, ViewGroup parent){
        Fruit fruit = getItem(postion);
        View view;
        if (convertView == null) {
            view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false);
        } else {
            view = convertView
        }
        ... = view.finViewById(...);
        return view;
    }
}

在代碼中首先判斷視圖是否存在,如果不存在缀程,則新建布局搜吧,否則直接加載已有的布局。

通過以上代碼杨凑,可以解決每次都需要重新加載視圖的問題滤奈,單是依舊需要每次使用 findViewById 方法獲取控件的實(shí)例×寐可以借助 ViewHolder 方法優(yōu)化:

public class FruitAdapter extends ArrayAdapter<Fruit> {
    private int resourceId;
    
    public FruitAdapter(Context context, int textViewResourceId, List<Fruit> objects) {
        super(context, textViewResourceId, objects);
        resourceId = textViewResourceId;
    }
    
    @Override
    public View getView(int postion, View convertView, ViewGroup parent){
        Fruit fruit = getItem(postion);
        View view;
        ViewHolder viewHolder;
        if (convertView == null) {
            view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false);
            viewHolder = new ViewHolder();
            viewHolder.... = view.findViewById(...);
            view.setTag(viewHolder);
        } else {
            view = convertView;
            viewHolder = view.getTag();
        }
        ... = view.finViewById(...);
        return view;
    }
}

首先蜒程,準(zhǔn)備一個(gè) ViewHolder,當(dāng)需要新建 view 的時(shí)候伺帘,就將 view 中的組件通過 setTag 方法將 viewHolder 存入該 view 中昭躺。

ListView 中的點(diǎn)擊事件

通過設(shè)置 ListView 對(duì)象的 setOnItemClickListener 方法可以實(shí)現(xiàn) ListView 子項(xiàng)的點(diǎn)擊:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        ......
    }
});
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市伪嫁,隨后出現(xiàn)的幾起案子领炫,更是在濱河造成了極大的恐慌,老刑警劉巖张咳,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件帝洪,死亡現(xiàn)場離奇詭異,居然都是意外死亡脚猾,警方通過查閱死者的電腦和手機(jī)葱峡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來婚陪,“玉大人族沃,你說我怎么就攤上這事。” “怎么了脆淹?”我有些...
    開封第一講書人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵常空,是天一觀的道長。 經(jīng)常有香客問我盖溺,道長漓糙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任烘嘱,我火速辦了婚禮昆禽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蝇庭。我一直安慰自己醉鳖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開白布哮内。 她就那樣靜靜地躺著盗棵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪北发。 梳的紋絲不亂的頭發(fā)上纹因,一...
    開封第一講書人閱讀 52,584評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音琳拨,去河邊找鬼瞭恰。 笑死,一個(gè)胖子當(dāng)著我的面吹牛狱庇,可吹牛的內(nèi)容都是我干的惊畏。 我是一名探鬼主播,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼密任,長吁一口氣:“原來是場噩夢啊……” “哼陕截!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起批什,我...
    開封第一講書人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎社搅,沒想到半個(gè)月后驻债,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡形葬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年合呐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片笙以。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡淌实,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拆祈,我是刑警寧澤恨闪,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站放坏,受9級(jí)特大地震影響咙咽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜淤年,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一钧敞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧麸粮,春花似錦溉苛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至威根,卻和暖如春凤巨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背洛搀。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來泰國打工敢茁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人留美。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓彰檬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親谎砾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子逢倍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361

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