ListView的深入簡出的使用

ListView深入簡出(一)

瞭解ListView

ListView(由多個相同視圖的行組成的列表)
繼承結構如下(可以自己點進去看下)
首先listView繼承ABsListView
在這裏插入圖片描述
ABsListView繼承了AdapterView
在這裏插入圖片描述
AdapterView繼承ViewGroup
在這裏插入圖片描述
ViewGroup繼承了View
在這裏插入圖片描述
所以明確的第一點ListView本質上還是一個控件。

ListView的基本使用

Layout中如何展示ListView

在Layout中展示ListView與TextView,Button的使用類似.
 <ListView
        android:id="@+id/main_list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
 </ListView>

但是與普通控件的不同之處是,ListView這樣做只是一個視圖,並沒有真實東西.
這個時候就還需要一個Adapter .
Adapter是什麼?適配器!!!!

Adapter是怎麼做適配的呢?

adapter怎麼適配的

左邊每一行的item都是一個View,但是光有佈局是不行的,還要有數據填充,(就跟單純線性佈局沒有是不會在界面有任何效果是差不多的道理),那麼右邊就是數據了。
通俗而言,就是每一臺臺式電腦都有一個屏幕和一個主機,item相當於屏幕,data相當於主機,沒有主機光有屏幕是沒有用的。
所以Adapter的作用,就是讓屏幕和主機綁定起來,形成一臺完整的臺式電腦。

ListView的實現步驟:(將由一個簡單的案例演示)

  1. 在Layout中創建ListView
 <ListView
        android:id="@+id/main_list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
 </ListView>
拿到ListView,可以在後面對它進行處理
  ListView main_list_view = findViewById(R.id.main_list_view);
  1. 創建每一行item的layout
<?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"
    android:orientation="horizontal">

    <ImageView
        android:id="@+id/app_image"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:src="@android:drawable/star_big_on"
        />
    <TextView
        android:id="@+id/app_name"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:gravity="center_vertical"
        android:paddingLeft="6dp"
        android:textSize="20sp"
        android:text="@string/app_name"/>

</LinearLayout>

在這裏插入圖片描述

  1. 創建每一行的數據 (對應關係)
    這裏暫時創建一個純文本的集合
//創建一個String類型的集合
List<String> appNames = new ArrayList<>();
appName.add("QQ");
appName.add("Wechat");
appName.add("瀏覽器");
  1. 用adapter 將數據填充數據item中
    這裏演示使用的是BaseAdapter,一個功能比較強大的適配器。
    BseAdapter是一個抽象類,常用於和Android一些控件如ListView,GridView,Spinner等控件結合來顯示數據的一個適配器,在安卓中佔有很重要的位置。結構如下:
    在這裏插入圖片描述
    BaseAdapter的使用步驟:由於是一個抽象類,所以在使用前,我們需要定義一個類來繼承該類,並且要實現對應的抽象方法。
    回到本次演示,我們一起觀看:
    我們自定義了一個MyAdapter類繼承了BaseAdapter並實現了它的抽象方法。
    其中:
    getCount() 一共有多少條數據
    getItem(int i) 獲取當前i這個位置這一條的數據
    getItemId(int i) 返回每個Item 的ID
    最重要的方法:

    getView(int i,View view,ViewGroup viewgroup) 重繪視圖

調用的次數是由getCount() 這個方法確定的,並且這個方法有一個返回值,
返回值就是我們要返回的視圖對象。

**參數介紹: i 就是位置 從0開始
view 就是每一項中要顯示的view,listview中的每一行
viewgroup 就是父窗體,相當於此處的listview自己。**

在這裏插入圖片描述
在這裏插入圖片描述
我們在getView中通過加載我們自定義的item文件去得到了item文件中ImageView和TextView,相當於這一行的視圖對象。
然後把構造函數中我們傳遞過來的視圖對象的數據設置到了TextView中,(此時我們並沒有去操作ImageView的內容,所以還是會顯示本身我在佈局文件中設置的圖片),並且返回了view(當前這一行對象).
接着我回到oncreate方法爲我的listview綁定了適配器,記得我前面說的,兩者缺一不可,需要結合,這樣我們的listView就有數據了。
在這裏插入圖片描述
在這裏插入圖片描述
接下來我們用做一個獲取系統所有應用的圖標和文本並顯示在listview上的小demo:
首先我們定義了一個取出系統所有應用信息的 方法:

 //取出系統所有應用信息
    private List<ResolveInfo> getAppInfos(){
        Intent intent = new Intent(Intent.ACTION_MAIN,null);
        intent.addCategory(Intent.CATEGORY_LAUNCHER);
        //返回應用的pakgeManager查詢出來的應用信息列表
        return getPackageManager().queryIntentActivities(intent,0);
    }

然後和之前一樣在adapter的getView中獲取視圖設置數據返回視圖,

 @Override
        public View getView(int i, View view, ViewGroup viewGroup) {
            //處理view -- > data 適配的過程 填充數據
            //把layout 文件 變成 java對象
            view = LayoutInflater.from(MainActivity.this).inflate(R.layout.item_app_list,null);
            //讀取佈局的視圖 通過view
            ImageView app_image = view.findViewById(R.id.app_image);
            TextView app_name =view.findViewById(R.id.app_name);
            //取出數據 設置數據
            //每次getView設置這一行的視圖數據
            app_name.setText(appNames.get(i).activityInfo.loadLabel(getPackageManager()));
            app_image.setImageDrawable(appNames.get(i).activityInfo.loadIcon(getPackageManager()));
            return view;
        }

最後綁定適配器,就ok啦

  ListView main_list_view = findViewById(R.id.main_list_view);
        //得到所有應用數據傳入Adapter 爲listView設置適配器
  main_list_view.setAdapter(new MyAdapter(getAppInfos()));

第一章就暫時到這啦,晚點我們再一起繼續深入學習ListView,

發佈了8 篇原創文章 · 獲贊 2 · 訪問量 1111
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章