上一篇文章我们介绍了关于ListView的基本知识,也说到了一些关于数据适配器Adapter的问题,这里我们继续介绍两种比较常见的数据适配器的类型,ArrayAdapter和SimpleAdapter。这两种适配器各自有各自的特点,适用于不同的情况。
ArrayAdapter
这种适配器比较简单,常用于仅仅是文本内容的ListView、没有图标或者比较复杂的布局的情况下,实现方法主要就是去填写构造函数中的参数,ArrayAdapter函数的构造方法有好几种,这里介绍了最主要的两种情况,具体可以看代码中的注释。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
package
com.example.arrayadapter;
import
android.app.Activity;
import
android.os.Bundle;
import
android.widget.ArrayAdapter;
import
android.widget.ListView;
public
class
MainActivity
extends
Activity {
private
String[] names = {
"功能1"
,
"功能2"
,
"功能3"
,
"功能4"
,
"功能5"
,
"功能6"
};
private
ListView lv;
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.lv);
//方法1 3参数构造函数,要求加载的layout文件只能有一个TextView
lv.setAdapter(
new
ArrayAdapter
this
, R.layout.simple_textview, names));
//方法2 4参数构造函数,加载一个普通layout文件,并指定TextView的id
lv.setAdapter(
new
ArrayAdapter
this
, R.layout.list_item, R.id.tv_item, names));
}
}
|
MainActivity的xml文件很简单,就是一个LinearLayout加一个ListView,而simple_textview的xml文件如下:
1
2
3
4
5
6
7
8
|
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
TextView
xmlns:android
=
"http://schemas.android.com/apk/res/android"
android:id
=
"@+id/simple_tv"
android:layout_width
=
"match_parent"
android:layout_height
=
"wrap_content"
android:textSize
=
"20sp"
>
TextView
>
|
list_item布局文件如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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
=
"vertical"
>
<
TextView
android:id
=
"@+id/tv_item"
android:layout_width
=
"match_parent"
android:layout_height
=
"wrap_content"
android:textSize
=
"18sp"
/>
LinearLayout
>
|
两种方法其实差别不太大。
SimpleAdapter
这种数据适配器虽然名字叫simple,用起来却要比另外两种要麻烦一些,它支持界面布局更加复杂的Listview显示,比如要实现左边一个icon ,右边一个文字说明这种情况,用SimpleAdapter来实现就比较简单了。为了实际演示效果我们可以去sdk里面找一些drawable-icon出来,放到drawable-hdpi文件里面。这里我随便找了几个:
接下来我们来看一下关键的setAdapter一步怎么写,我们查看SimpleAdapter的函数介绍,发现这货构造函数有5个参数,分别是:
context 上下文,这个没什么好说的
data 官方解释是:A List of Maps. Each entry in the List corresponds to one row in the list. The Maps contain the data for each row, and should include all the entries specified in “from”简单的说就是一个List,每一个元素又是一个map集合,用来存放需要显示的数据对
resource 即数据要显示的布局文件的id
from 和 to 他们的功能是为了使data数据里面的key和布局文件中的id绑定起来,其中from里面是一个key的数组,而to 是一个int数组,表示布局文件中要显示key内容控件对应的R.id
这么一看,我们只需要细心的填写好这几个参数,API就会自动帮我们加载好界面了,我们来看看代码:
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
35
36
37
38
39
40
41
42
43
|
package
com.example.simpleadapter;
import
java.util.ArrayList;
import
java.util.HashMap;
import
java.util.List;
import
java.util.Map;
import
android.app.Activity;
import
android.os.Bundle;
import
android.renderscript.Int2;
import
android.widget.ListView;
import
android.widget.SimpleAdapter;
public
class
MainActivity
extends
Activity {
private
ListView lv;
private
List
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.lv);
data =
new
ArrayList
Map
new
HashMap
map1.put(
"nametext"
,
"我是第一个文本"
);
map1.put(
"icon"
, R.drawable.ic_menu_call);
Map
new
HashMap
map2.put(
"nametext"
,
"我是第二个文本"
);
map2.put(
"icon"
, R.drawable.ic_menu_camera);
Map
new
HashMap
map3.put(
"nametext"
,
"我是第三个文本"
);
map3.put(
"icon"
, R.drawable.ic_menu_chat_dashboard);
data.add(map1);
data.add(map2);
data.add(map3);
lv.setAdapter(
new
SimpleAdapter(
this
, data, R.layout.view_item,
new
String[] {
"icon"
,
"nametext"
},
new
int
[] {R.id.iv,R.id.tv}));
}
}
|
其中view_item.xml里面是一个横向的ListView,有一个ImageView存放icon,以及一个TextView存放文字说明:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
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:gravity
=
"center_vertical"
android:orientation
=
"horizontal"
>
<
ImageView
android:id
=
"@+id/iv"
android:layout_width
=
"wrap_content"
android:layout_height
=
"wrap_content"
/>
<
TextView
android:id
=
"@+id/tv"
android:layout_width
=
"match_parent"
android:layout_height
=
"wrap_content"
/>
LinearLayout
>
|
最后我们在模拟器上执行代码,得到最终效果,这样就比较美观了:
通过SimpleAdapter,我们就可以设计出各式各样自定义风格的ListView了。
欢迎转载,请注明出处。
搬运自本人博客,xge技术博客:
http://www.xgezhang.com/android_listview_intro.html