讓ListView更強大的BaseAdapter
- 上一篇文章中的例子我們使用了ArrayAdapter作為數(shù)據(jù)與ListView的橋梁,完成將數(shù)據(jù)加載到ListView的功能。但展示出來的列表(子項)數(shù)據(jù)顯得太過單調,沒有一個子項該有的復雜。例如我們想要一個子項顯示一個聯(lián)系人信息,那它必然包含頭像、姓名、聯(lián)系電話等詳細信息。那我們如何實現(xiàn)這一功能呢,答案很明顯,我們需要用到BaseAdapter來自定義一個適配器。
BaseAdapter是什么?
-
BaseAdapter是Android應用程序中經常用到的基礎數(shù)據(jù)適配器的基類,它實現(xiàn)了Adapter接口。它可以將一組數(shù)據(jù)傳到ListView顯示組件進行顯示。使用BaseAdapter主要是通過繼承此類來實現(xiàn)BaseAdapter的四個方法:
public int getCount(): 適配器中數(shù)據(jù)集的數(shù)據(jù)個數(shù)。
public Object getItem(int position): 獲取數(shù)據(jù)集中與索引對應的數(shù)據(jù)項。
public long getItemId(int position): 獲取指定行對應的ID。
public View getView(int position,View convertView,ViewGroup parent): 獲取每一行Item的顯示內容。
利用BaseAdapter完成簡單通訊錄
- 我們準備完成的功能:
- 創(chuàng)建自定適配器MyAdapter繼承自BaseAdapter,重寫上述四個方法。在getView()方法中綁定布局,設置內容。
- 在主活動頁面顯示已定義好聯(lián)系人數(shù)據(jù)。
- 可以手動增加聯(lián)系人到列表中。
- 創(chuàng)建自定義適配器MyAdapter。
關鍵代碼如下:
public class MyAdapter extends BaseAdapter {
private LayoutInflater layoutInflater;
private Context mcontext;
private List<Person> personlist;
public MyAdapter (Context context, List<Person> list) {
layoutInflater = LayoutInflater.from(context);
this.mcontext = context;
this.personlist = list;
}
@Override
public int getCount() {
return personlist.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
View view;
if (convertView == null) {
view = layoutInflater.inflate(R.layout.person_information, null);
}
else{
view = convertView;
}
//綁定布局
TextView textView = (TextView)view.findViewById(R.id.text_name);
TextView textView1 = (TextView)view.findViewById(R.id.text_phonenumber);
ImageView imageView = (ImageView)view.findViewById(R.id.image);
//設置內容
textView.setText(personlist.get(position).getName());
textView1.setText(personlist.get(position).getPhonenum());
imageView.setImageResource(personlist.get(position).getImageId());
return view;
}
}
一些說明
-
public MyAdapter (Context context, List<Person> list)這是MyAdapter的有參構造方法,用于獲取獲取context和list對象。其中第一個參數(shù)傳入上下文,第二個參數(shù)傳入適配數(shù)據(jù)集合,這里我們傳入一個List集合(其中包含聯(lián)系人數(shù)據(jù))。
LayoutInflater是自定義適配器常用的一個類,它的作用類似于findViewById()。不同點是LayoutInflater是用來找layout下的xml布局文件,并且實例化。 -
public View getView(int position, View convertView, ViewGroup parent)用來獲取每一行Item所需的數(shù)據(jù)。
- 第二個功能和第三個功能我們放在一起實現(xiàn),他們都定義在MainActivity中。
定義一些初始化聯(lián)系人數(shù)據(jù),代碼如下:
private void getData() {
Person p1 = new Person("jjj", "223253", R.drawable.banana_pic);
Person p2 = new Person("高老板", "12534315", R.drawable.apple_pic);
Person p3 = new Person("蛤", "23454353", R.drawable.mango_pic);
Person p4 = new Person("hk", "223245342", R.drawable.strawberry_pic);
Person p5 = new Person("齊", "46543", R.drawable.pear_pic);
Person p6 = new Person("ppn", "456546", R.drawable.banana_pic);
personList.add(p1);
personList.add(p2);
personList.add(p3);
personList.add(p4);
personList.add(p5);
personList.add(p6);
}
點擊按鈕,添加聯(lián)系人到ListView列表中,代碼如下:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String name = editText1.getText().toString();
String number = editText2.getText().toString();
Person p7 = new Person(name, number, R.drawable.pineapple_pic);
personList.add(p7);
}
});
一些說明
-
Person p1 = new Person("jjj", "223253", R.drawable.banana_pic);Person是我們自定義的一個類,用于存儲聯(lián)系人姓名、電話號碼、頭像ID。它的具體代碼在最后給出。 -
personList.add(p1);personlist是實例化的一個集合,通過add()方法可以將每個聯(lián)系人對象添加到此集合中,用于傳參。
我們來看一看具體實現(xiàn)效果
-
初始界面如下:
初始化界面 -
添加聯(lián)系人成功后:
添加聯(lián)系人
Github地址
- 主布局代碼
https://github.com/0xmxhnc/AndroidTest/blob/master/AddressBook/app/src/main/res/layout/activity_main.xml - 子項布局代碼
https://github.com/0xmxhnc/AndroidTest/blob/master/AddressBook/app/src/main/res/layout/person_information.xml - 主活動代碼
https://github.com/0xmxhnc/AndroidTest/blob/master/AddressBook/app/src/main/java/com/example/addressbook/MainActivity.java - 自定義適配器代碼
https://github.com/0xmxhnc/AndroidTest/blob/master/AddressBook/app/src/main/java/com/example/addressbook/MyAdapter.java - 自定義Person類代碼
https://github.com/0xmxhnc/AndroidTest/blob/master/AddressBook/app/src/main/java/com/example/addressbook/Person.java

