Android開發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是怎麼做適配的呢?
左邊每一行的item都是一個View,但是光有佈局是不行的,還要有數據填充,(就跟單純線性佈局沒有是不會在界面有任何效果是差不多的道理),那麼右邊就是數據了。
通俗而言,就是每一臺臺式電腦都有一個屏幕和一個主機,item相當於屏幕,data相當於主機,沒有主機光有屏幕是沒有用的。
所以Adapter的作用,就是讓屏幕和主機綁定起來,形成一臺完整的臺式電腦。
ListView的實現步驟:(將由一個簡單的案例演示)
- 在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);
- 創建每一行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>
- 創建每一行的數據 (對應關係)
這裏暫時創建一個純文本的集合
//創建一個String類型的集合
List<String> appNames = new ArrayList<>();
appName.add("QQ");
appName.add("Wechat");
appName.add("瀏覽器");
-
用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,