http://www.open-open.com/lib/view/open1376969095803.html


1.SimpleAdapter(很多时候需要继承它,来自定义adapter):

simpleAdapter的扩展性最好,可以定义各种各样的布局出来,可以放上ImageView(图片)等。可以显示比较复杂的列表,包括每行显示图片、文字等,但不能对列表进行后期加工(在java代码中加工),也是只是单纯的负责显示

01 publicclassImageListViewextendsListActivity {
02 @Override
03 publicvoidonCreate(Bundle savedInstanceState) {
04 super.onCreate(savedInstanceState);
05
06 SimpleAdapter adapter =newSimpleAdapter(this,getData(),R.layout.imagelayout,
07 newString[]{"title","info","img"},
08 newint[]{R.id.title,R.id.info,R.id.img});
09 setListAdapter(adapter);
10 }
11 privateList<Map<String, Object>> getData() {
12 List<Map<String, Object>> mList =newArrayList<Map<String, Object>>();
13 Map<String, Object> map =newHashMap<String, Object>();
14 map.put("title","tp");
15 map.put("info","fb");
16 map.put("img", R.drawable.icon);
17 mList.add(map);
18
19 map =newHashMap<String, Object>();
20 map.put("title","tp2");
21 map.put("info","fb2");
22 map.put("img", R.drawable.icon2);
23 list.add(map);
24 returnlist;
25 }
26 }

使用simpleAdapter的数据用一般都是HashMap构成的List,list的每一节对应ListView的每一行。HashMap的每个键值数据映射到布局文件中对应id的组件上。因为系统没有对应的布局文件可用,我们可以自己定义一个布局imagelayout.xml

2.ArrayAdapter:只可以简单的显示一行文本

01 publicclassImageListViewextendsActivity {
02 privateListView mListView;
03 @Override
04 publicvoidonCreate(Bundle savedInstanceState){
05 super.onCreate(savedInstanceState);
06 mListView =newListView(this);
07 mListView.setAdapter(newArrayAdapter<String>(this, android.R.layout.simple_list_item, getData()));
08 setContentView(mListView);
09 }
10
11 privateList<String> getData(){
12 List<String> data =newArrayList<String>();
13 data.add("百度图片");
14 data.add("腾讯图片");
15 data.add("360图片");
16 returndata;
17 }
18 }

使用了ArrayAdapter(Context context, int textViewResourceId, List<T> objects)来装配数据,要装配这些数据就需要一个连接ListView视图对象和数组数据的适配器来两者的适配工作,ArrayAdapter的构造需要三个参数,依次为this,布局文件(注意这里的布局文件描述的是列表的每一行的布局,android.R.layout.simple_list_item是系统定义好的布局文件只显示一行文字,数据源(一个List集合)。同时用 setAdapter()完成适配的最后工作。

3.BaseAdapter(自定义的时候很多,尤其是一些复杂的布局,不自定义实现不了啊):实现复杂的列表布局,由于BaseAdapter是一个抽象类,使用该类需要自己写一个适配器继承该类,正是由于继承了该类,需要我们重写一些方法,让我们可以在代码里控制列表的样式,更加灵活。

01 publicclassImageListViewextendsListActivity {
02 privateList<Map<String, Object>> mData;
03 @Override
04 publicvoidonCreate(Bundle savedInstanceState) {
05 super.onCreate(savedInstanceState);
06 mData = getData();
07 ImageBaseAdapter adapter = newImageBaseAdapter(this);
08 setListAdapter(adapter);
09 }
10 privateList<Map<String, Object>> getData() {
11 List<Map<String, Object>> list =newArrayList<Map<String, Object>>();
12 Map<String, Object> map =newHashMap<String, Object>();
13 map.put("title","tp");
14 map.put("info","fb");
15 map.put("img", R.drawable.icon);
16 list.add(map);
17
18 map =newHashMap<String, Object>();
19 map.put("title","tp1");
20 map.put("info","fb2");
21 map.put("img", R.drawable.icon2);
22 list.add(map);
23 returnlist;
24 }
25 @Override
26 protectedvoidonListItemClick(ListView l, View v,intposition,longid) {
27 }
28 publicvoidshowInfo(){
29 newAlertDialog.Builder(this)
30 .setTitle("listview")
31 .setMessage("介绍...")
32 .setPositiveButton("确定",newDialogInterface.OnClickListener() {
33 @Override
34 publicvoidonClick(DialogInterface dialog,intwhich) {
35 }
36 }).show();
37 }
38 publicfinalclassViewHolder{
39 publicImageView img;
40 publicTextView title;
41 publicTextView info;
42 publicButton viewBtn;
43 }
44
45 publicclassImageBaseAdapterextendsBaseAdapter{
46 privateLayoutInflater mInflater;
47 publicImageBaseAdapter(Context context){
48 this.mInflater = LayoutInflater.from(context);
49 }
50 @Override
51 publicintgetCount() {
52 returnmData.size();
53 }
54 @Override
55 publicObject getItem(intarg0) {
56 returnnull;
57 }
58 @Override
59 publiclonggetItemId(intarg0) {
60 return0;
61 }
62 @Override
63 publicView getView(intposition, View convertView, ViewGroup parent) {
64 ViewHolder holder =null;
65 if(convertView ==null) {
66 holder=newViewHolder();
67 convertView = mInflater.inflate(R.layout.vlist,null);
68 holder.img = (ImageView)convertView.findViewById(R.id.img);
69 holder.title = (TextView)convertView.findViewById(R.id.title);
70 holder.info = (TextView)convertView.findViewById(R.id.info);
71 holder.viewBtn = (Button)convertView.findViewById(R.id.view_btn);
72 convertView.setTag(holder);
73 }else{
74 holder = (ViewHolder)convertView.getTag();
75 }
76 holder.img.setBackgroundResource((Integer)mData.get(position).get("img"));
77 holder.title.setText((String)mData.get(position).get("title"));
78 holder.info.setText((String)mData.get(position).get("info"));
79 holder.viewBtn.setOnClickListener(newView.OnClickListener() {
80 @Override
81 publicvoidonClick(View v) {
82 showInfo();
83 }
84 });
85 returnconvertView;
86 }
87 }
88 }

系统首先调用getCount()函数,根据他的返回值得到listView的长度(这也是为什么在开始的第一张图特别的标出列表长度),然后根据这个长度,调用getView()逐一绘制每一行。如果你的getCount()返回值是0的话,列表将不显示同样return 1,就只显示一行。
系统显示列表时,首先实例化一个适配器(这里将实例化自定义的适配器)。当手动完成适配时,必须手动映射数据,这需要重写getView()方法。系统在绘制列表的每一行的时候将调用此方法。getView()有三个参数,position 表示将显示的是第几行,covertView是从布局文件中inflate来的布局。我们用LayoutInflater的方法将定义好的 vlist2.xml文件提取成View实例用来显示。然后将xml文件中的各个组件实例化(简单的findViewById()方法)。这样便可以将数据对应到各个组件上了。


更多相关文章

  1. Android(安卓)Studio 移动项目到新文件夹,Installation failed wi
  2. Android(安卓)- 预装(push) lib64中so文件查找错误
  3. Android通过编译源代码提供系统服务-android学习之旅(85)
  4. android程序界面自动适应屏幕分辨率例子
  5. 【Android(安卓)Developers Training】 38. 文件共享需求
  6. RelativeLayout相对布局介绍及属性介绍
  7. 一个RecyclerView列表显示多种类型的Item
  8. Android自动化工具Monkeyrunner使用(二)
  9. android自动加载模块.ko文件的小方法

随机推荐

  1. Android——CheckBox【复选框】 点击事件
  2. android Studio 低版本升级gradle3.0以上
  3. Android(安卓)模拟MotionEvent事件 触发
  4. RelativeLayout常用属性介绍
  5. Android(安卓)长按setOnItemLongClickLis
  6. Android接口初了解
  7. Android中贪吃蛇游戏的学习(四)
  8. android 网络请求图片
  9. Android、Java单例看这里(常用的单例模式
  10. Android(安卓)将Button设置为圆角