Listview(列表视图)
一.ListView
1.三种Adapter构建ListView
ListView添加条目的时候, 可以使用setAdapter(ListAdapter)方法, 常用的ListAdapter有三种
BaseAdapter: 定义一个类继承BaseAdapter, 重写4个抽象方法, ListView的条目是由getView()方法构建出来的
SimpleAdapter: 创建SimpleAdapter对象时, 传入数据(List<Map<String, ?>>), 并指定数据的绑定关系
SimpleCursorAdapter: 创建SimpleCursorAdapter对象时, 传入一个Cursor, 指定数据的绑定关系
2.监听ListView的点击
调用ListView.setOnItemClickListener(OnItemClickListener)方法注册一个监听器
在监听器的onItemClick()方法中使用 parent.getItemAtPosition(position) 方法可以获取指定条目上的数据
BaseAdapter: 返回的就是自定义的getItem()方法中返回的数据
SimpleAdapter: 返回的是一个Map, 就是创建SimpleAdapter时List中的一个Map
SimpleCursorAdapter: 返回的是一个Cursor, 这个Cursor就是创建时传入的Cursor, 但是已经通过moveToPosition()方法指定到点击的索引了
BaseAdapter:
private ListView personLV;
private List <Person > persons;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
PersonDao dao = new PersonDao( this);
persons = dao.queryAll(); // 获取数据
personLV = (ListView) findViewById(R.id.personLV); // 获取ListView
personLV.setAdapter( new MyBaseAdapter()); // 给ListView添加Adapter, 按照Adapter中的方法对ListView添加条目
}
private class MyBaseAdapter extends BaseAdapter { // 定义Adapter, 把每个Person对象生成一个条目, 将所有条目装入ListView
public int getCount() { // 返回ListView中要装入的条目的数量
return persons.size();
}
public Object getItem( int position) { // 返回指定位置上的对象
return persons.get(position);
}
public long getItemId( int position) { // 返回条目的id
return position;
}
public View getView( int position, View convertView, ViewGroup parent) { // 返回指定位置上的条目, 条目会被自动添加到ListView中
View item = View.inflate(getApplicationContext(), R.layout.item, null); // 根据布局文件创建View(LinearLayout)
TextView idTV = (TextView) item.findViewById(R.id.idTV); // 获取这个新生成的View中的TextView
TextView nameTV = (TextView) item.findViewById(R.id.nameTV);
TextView balanceTV = (TextView) item.findViewById(R.id.balanceTV);
Person p = persons.get(position); // 根据位置获取Person对象
idTV.setText(p.getId() + ""); // 给TextView设置文本
nameTV.setText(p.getName());
balanceTV.setText(p.getBalance() + "");
return item;
}
}
}
private ListView personLV;
private List <Person > persons;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
PersonDao dao = new PersonDao( this);
persons = dao.queryAll();
List <Map <String, Object >> data = new ArrayList <Map <String,Object >>(); // 把每个Person的数据装入一个Map, 再把Map装入List
for (Person p : persons) {
Map <String, Object > map = new HashMap <String, Object >();
map.put( "id", p.getId());
map.put( "name", p.getName());
map.put( "balance", p.getBalance());
data.add(map);
}
personLV = (ListView) findViewById(R.id.personLV);
personLV.setAdapter( new SimpleAdapter( this, data, R.layout.item //
, new String[] { "id", "name", "balance" } //
, new int[] { R.id.idTV, R.id.nameTV, R.id.balanceTV }));
/*
* SimpleAdapter传入指定的数据和布局文件, 以及匹配关系, 自动生成View, 装入ListView
*
* 参数1: 上下文环境
* 参数2: 数据, List<Map<String, Object>>, 每个Person的数据装入一个Map, 将所有Map装入List
* 参数3: 每个listview中的布局xml文件的资源id
* 参数4: Map中的key, 和参数5中的id对应, 将指定key的value放入View中指定id对应的组件上
* 参数5: View中的id
*/
}
}
ArrayAdapter:
activity_listview.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
android:layout_width
=
"match_parent"
android:layout_height
=
"match_parent"
android:orientation
=
"vertical"
tools:context
=
".ListviewActivity"
>
<
ListView
android:id
=
"@+id/listview"
android:layout_width
=
"fill_parent"
android:layout_height
=
"wrap_content"
android:divider
=
"#f00"
android:dividerHeight
=
"2px"
android:headerDividersEnabled
=
"false"
/>
</
LinearLayout
>
|
simple_item.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
android:layout_width
=
"match_parent"
android:layout_height
=
"match_parent"
android:orientation
=
"horizontal"
>
<
ImageView
android:id
=
"@+id/iv"
android:layout_width
=
"80dp"
android:layout_height
=
"100dp"
android:paddingLeft
=
"20dp"
/>
<
LinearLayout
android:layout_width
=
"match_parent"
android:layout_height
=
"wrap_content"
android:orientation
=
"vertical"
>
<
TextView
android:id
=
"@+id/tv1"
android:layout_width
=
"wrap_content"
android:layout_height
=
"wrap_content"
android:paddingLeft
=
"20dp"
android:textColor
=
"#f0f"
android:textSize
=
"20dp"
/>
<
TextView
android:id
=
"@+id/tv2"
android:layout_width
=
"wrap_content"
android:layout_height
=
"wrap_content"
android:paddingLeft
=
"10dp"
android:textSize
=
"20dp"
/>
</
LinearLayout
>
</
LinearLayout
>
|