Android中ListView控件的簡單使用

文章引自郭霖《第一行代碼》

ListView允許用戶通過手指上下滑動的方式將屏幕外的數(shù)據(jù)滾動到屏幕內(nèi)斑粱,同時屏幕上原有的數(shù)據(jù)則會滾動出屏幕

使用LIstView控件

  1. 1 在布局文件中引入ListView控件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ListView
        android:id="@+id/list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </ListView>

</LinearLayout>
  1. 2 創(chuàng)建ListView子項布局(可以使用Android提供的布局方式)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ImageView
        android:id="@+id/fruit_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/fruit_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginLeft="10dip" />

</LinearLayout>
  1. 3 定義實體類,做為ListView適配器的適配類型
public class Fruit {

    private String name;

    private int imageId;

    public Fruit(String name, int imageId) {
        this.name = name;
        this.imageId = imageId;
    }

    public String getName() {
        return name;
    }

    public int getImageId() {
        return imageId;
    }

}
  1. 4 創(chuàng)建一個自定義的適配器(可以使用Android提供的適配器)
public class FruitAdapter extends ArrayAdapter<Fruit> {

    private int resourceId;
    /**
      *context:當(dāng)前活動上下文 
      *textViewResourceId:ListView子項布局的ID
      *objects:要適配的數(shù)據(jù)
      */               
    public FruitAdapter(Context context, int textViewResourceId,
            List<Fruit> objects) {
        super(context, textViewResourceId, objects);
        //拿取到子項布局ID
        resourceId = textViewResourceId;
    }

    /**
     * LIstView中每一個子項被滾動到屏幕的時候調(diào)用
     * position:滾到屏幕中的子項位置怀樟,可以通過這個位置拿到子項實例
     * convertView:之前加載好的布局進(jìn)行緩存
     */
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        Fruit fruit = getItem(position);  //獲取當(dāng)前項的Fruit實例
        //為子項動態(tài)加載布局
        View view = LayoutInflater.from(getContext()).inflate(resourceId, null);
        ImageView fruitName = (ImageView) view.findViewById(R.id.fruid_image);
        TextView fruitName = (TextView) view.findViewById(R.id.fruit_name);
        fruitImage.setImageResource(fruit.getImageId());
        fruitName.setText(fruit.getName());
        return view;
    }

}
  1. 5 創(chuàng)建適配器對象(依次傳入當(dāng)前上下文喜鼓,ListView子項布局ID副砍,適配的數(shù)據(jù))
FruitAdapter adapter = new FruitAdapter(MainActivity.this, R.layout.fruit_item, fruitList);
  1. 6 調(diào)用LIstView的setAdapter()方法,將構(gòu)建好的適配器對象傳遞進(jìn)去庄岖,這樣LIstView和數(shù)據(jù)之間的關(guān)聯(lián)就建立完成了
listView.setAdapter(adapter);

至此豁翎,LIstView控件就可以使用

LIstView的性能優(yōu)化

對適配器的代碼進(jìn)行修改:

  • 對已緩存的布局直接使用緩存,對為緩存的布局重新加載
  • 使用內(nèi)部類對象存儲子項布局中子控件對象
public class FruitAdapter extends ArrayAdapter<Fruit> {

    private int resourceId;

    public FruitAdapter(Context context, int textViewResourceId,
            List<Fruit> objects) {
        super(context, textViewResourceId, objects);
        resourceId = textViewResourceId;
    }

    /*  由系統(tǒng)調(diào)用隅忿,獲取一個View對象心剥,作為ListView的條目,屏幕上能顯示多少個條目背桐,getView方法就會被調(diào)用多少次
     *  position:代表該條目在整個ListView中所處的位置优烧,從0開始
     */
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //重寫適配器的getItem()方法
        Fruit fruit = getItem(position);
        View view;
        ViewHolder viewHolder;
        if (convertView == null) { //若沒有緩存布局,則加載
            //首先獲取布局填充器链峭,然后使用布局填充器填充布局文件
            view = LayoutInflater.from(getContext()).inflate(resourceId, null);
            viewHolder = new ViewHolder();
            //存儲子項布局中子控件對象
            viewHolder.fruitImage = (ImageView) view.findViewById(R.id.fruit_image);
            viewHolder.fruitName = (TextView) view.findViewById(R.id.fruit_name);
            // 將內(nèi)部類對象存儲到View對象中
            view.setTag(viewHolder);
        } else { //若有緩存布局畦娄,則直接用緩存(利用的是緩存的布局,利用的不是緩存布局中的數(shù)據(jù))
            view = convertView;
            viewHolder = (ViewHolder) view.getTag();
        }
        viewHolder.fruitImage.setImageResource(fruit.getImageId());
        viewHolder.fruitName.setText(fruit.getName());
        return view;
    }
    
    //內(nèi)部類弊仪,用于存儲ListView子項布局中的控件對象
    class ViewHolder {
        
        ImageView fruitImage;
        
        TextView fruitName;
        
    }

}

ListView的點擊事件

listView.setOnItemClickListener(new OnItemClickListener() {  
    @Override                                                
    public void onItemClick(AdapterView<?> parent, View view,
            int position, long id) {                         
        Fruit fruit = fruitList.get(position);               
        // 加入邏輯代碼 
    }                                                        
});                                                                                                                

ListView適配器

ListView對象使用setAdapter(ListAdapter la)方法給ListView控件設(shè)置適配器

  • 適配器繼承BaseAdapter熙卡,必須重寫其getCount()getView()方法,靈活性高

  • 適配器繼承ArrayAdapter<T>励饵,此種適配器局限在于只能是一種類型驳癌,構(gòu)造方法:ArrayAdapter<T>(Context context, int resource, int textViewResourceId, T[] objects)

    • context:上下文對象
    • resource:ListView條目的布局文件ID
    • textViewResourceId:T 類型數(shù)據(jù)綁定在布局文件中的ID
    • objects:T 類型數(shù)據(jù)
  • 適配器繼承SimpleAdapter,構(gòu)造方法:SimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)

    • context:上下文對象
    • data:存儲Map集合的List對象役听,作為數(shù)據(jù)
    • resource:ListView條目的布局文件ID
    • from:存儲在Map集合中的鍵颓鲜,也就代表了要填充到子項布局中的數(shù)據(jù)
    • to:要將存儲在Map集合中的數(shù)據(jù)填充到子項布局中的控件ID
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末表窘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子甜滨,更是在濱河造成了極大的恐慌乐严,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件衣摩,死亡現(xiàn)場離奇詭異麦备,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)昭娩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來黍匾,“玉大人栏渺,你說我怎么就攤上這事∪裱模” “怎么了磕诊?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長纹腌。 經(jīng)常有香客問我霎终,道長,這世上最難降的妖魔是什么升薯? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任莱褒,我火速辦了婚禮,結(jié)果婚禮上涎劈,老公的妹妹穿的比我還像新娘广凸。我一直安慰自己,他們只是感情好蛛枚,可當(dāng)我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布谅海。 她就那樣靜靜地躺著,像睡著了一般蹦浦。 火紅的嫁衣襯著肌膚如雪扭吁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天盲镶,我揣著相機(jī)與錄音侥袜,去河邊找鬼。 笑死徒河,一個胖子當(dāng)著我的面吹牛系馆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播顽照,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼由蘑,長吁一口氣:“原來是場噩夢啊……” “哼闽寡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起尼酿,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤爷狈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后裳擎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涎永,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年鹿响,在試婚紗的時候發(fā)現(xiàn)自己被綠了羡微。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡惶我,死狀恐怖妈倔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情绸贡,我是刑警寧澤盯蝴,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站听怕,受9級特大地震影響捧挺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜尿瞭,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一闽烙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧声搁,春花似錦鸣峭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至充石,卻和暖如春莫换,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背骤铃。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工拉岁, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人惰爬。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓喊暖,卻偏偏與公主長得像,于是被迫代替她去往敵國和親撕瞧。 傳聞我的和親對象是個殘疾皇子陵叽,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,724評論 2 351

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,870評論 25 707
  • ¥開啟¥ 【iAPP實現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程狞尔,因...
    小菜c閱讀 6,376評論 0 17
  • 喜歡畫畫時的心情
    恩墨閱讀 413評論 7 11
  • 文/木子 “溫度”顧名思義為“暖的事物”偏序,第一次對溫度這個詞有觸動緣于李筱懿的那本《先謀生,后謀愛》胖替,書中說201...
    木子色的柚子閱讀 605評論 0 8
  • 第二天上學(xué)了研儒,時間還是沒有安排好,兩個孩子的學(xué)校離的有點遠(yuǎn)独令,委屈閨女跟著多跑那么多路端朵。還在糾結(jié)是先做午飯,還是備好...
    鄧文旭閱讀 105評論 0 0