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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容