安卓入門之ListView控制元件實現
ListView介紹
安卓中ListView是一種自定義清單表,我們經常在淘寶上搜索寶貝後所出現的上下可滑動的商品列表、QQ/微信訊息列表等都是ListView控制元件來做的,下面紅框框中就是ListView。
有沒有一種豁然開朗的感覺(瘋狂暗示)。。。所以掌握ListView這種控制元件的使用方法對Android開發是非常有用的。從QQ訊息清單中,每一個QQ好友列表就是ListView中的一個元素,每一行中我們發現有影象、Id、訊息、時間,這些就是ListView的每一個元素的組成部分,所以ListView還是比較強大的 ,它可以自定義各種風格,只有你想不到,沒有它做不到。
ListView使用原理
1. 建立自定義ListView顯示樣式layout_xml
2. 在Activity對應的XML中,拖入ListView,並設定ID
3. 在Activity中利用Java程式碼操作實現,介面卡原理
An Adapter object acts as a bridge between an AdapterView
and the underlying data for that view. The Adapter provides access to the data items. The Adapter is also responsible for making a
View
for each item in the data set.(摘自Android官網)
什麼是資料介面卡?
下圖展示了資料來源、介面卡、ListView等資料展示控制元件之間的關係。我們知道,資料來源是各種各樣的,而ListView所展示資料的格式則是有一定的要求的。資料介面卡正是建立了資料來源與ListView之間的適配關係,將資料來源轉換為ListView能夠顯示的資料格式,從而將資料的來源與資料的顯示進行解耦,降低程式的耦合性。這也體現了Android的介面卡模式的使用。對於ListView、GridView等資料展示控制元件有多種資料介面卡,本文講解最通用的資料介面卡——BaseAdapter。
. ListView的顯示與快取機制
我們知道,ListView、GridView等控制元件可以展示大量的資料資訊。假如下圖中的ListView可以展示100條資訊,但是螢幕的尺寸是有限的,一螢幕只能顯示下圖中的7條。當向上滑動ListView的時候,item1被滑出了螢幕區域,那麼系統就會將item1回收到Recycler中,即View緩衝池中,而將要顯示的item8則會從快取池中取出佈局檔案,並重新設定好item8需要顯示的資料,並放入需要顯示的位置。這就是ListView的緩衝機制,總結起來就是一句話:需要時才顯示,顯示完就被會收到快取。ListView,GridView等資料顯示控制元件通過這種快取機制可以極大的節省系統資源。
.BaseAdapter
使用BaseAdapter比較簡單,主要是通過繼承此類來實現BaseAdapter的四個方法:
public int getCount(): 介面卡中資料集的資料個數;
public Object getItem(int position): 獲取資料集中與索引對應的資料項;
public long getItemId(int position): 獲取指定行對應的ID;
public View getView(int position,View convertView,ViewGroup parent): 獲取沒一行Item的顯示內容。
實戰操作ListView
實戰說明:建立一個簡易學生資訊(包含性別、姓名、序號資訊)
實戰方法如下:
1.建立一個layout xml 並佈局完善id
2.在主XML中新增一個ListView控制元件和部分按鈕,佈局完善id
3.程式碼部分解讀:
建立Student資訊類
//自定義Student類
private class Student
{
String name;
boolean sex;
int id;
public Student(String name,boolean sex,int id)
{
this.name=name;
this.sex=sex;
this.id=id;
}
}
定義介面卡
//定義adapter
private class MyListAdapter extends BaseAdapter
{
// 男女圖示
Drawable[] icons = new Drawable[2];
public MyListAdapter()
{
icons[0] = MainActivity.this.getDrawable(R.drawable.ic_female);
icons[1] = getDrawable(R.drawable.ic_male);
}
@Override
public int getCount()
{
// 一共多少項
return listData.size();
}
@Override
public Object getItem(int position)
{
// 獲取每一項的資料
return listData.get(position);
}
@Override
public long getItemId(int position)
{
// 獲取某項對應的內部ID, 如果不需要,則直接把position作為ID
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
// 建立控制元件
if (convertView == null)
{
//將自定義layout xml(list_item_student)新增給convertView
convertView = getLayoutInflater()
.inflate(R.layout.list_item_student, parent, false);
}
// 獲取資料
Student data = (Student) getItem(position);
// 顯示資料
TextView textView = (TextView) convertView.findViewById(R.id.id_textview);
textView.setText(data.name+"("+data.id+")");
ImageView imageView = (ImageView)convertView.findViewById(R.id.id_imageview);
if (data.sex)
imageView.setImageDrawable(icons[1]);
else
imageView.setImageDrawable(icons[0]);
return convertView;
}
}
使用adapter
//Activity主頁中
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 準備資料
listData.add(new Student("小張", true));
listData.add(new Student("小王", false));
listData.add(new Student("小李", true));
//準備介面卡
MyListAdapter adapter=new MyListAdapter();
//新增adapter
ListView listview=(ListView)findViewById(R.id.id_listView);
listview.setAdapter(adapter);
}
效果圖顯示
展示的效果圖另外還添加了一些功能,但是基本的框架跟以上介紹的是一樣的。想要這個原碼的可以私聊我喲(免費滴嘛)
謝謝觀看,歡迎評論(如有不對,及時指教)