Android:ListViewAdapter
MainActivity:
package com.wyl.listview; 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.widget.ArrayAdapter; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.SimpleAdapter; public class MainActivity extends Activity { ListView listview; ListAdapter adapter; ListAdapter la; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); init(); } private void init() { listview = (ListView) findViewById(R.id.listview01); //// adapter.a // //数据源, // //1.新建适配器 // // // String[] a = {"the first","the second","第三个","张雅岚"}; //// List<String> b = new ArrayList<String>(); //// b.add("张雅岚"); //// b.add("wyl"); // adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, a); // listview.setAdapter(adapter); // // String[] c = {"one","two","three","four"}; // adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1 , c); // System.out.println("============="); // listview.setAdapter(adapter); // la = new SimpleAdapter(this, getData(), resource, from, to) // // public SimpleAdapter (Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to) // // Added in API level 1 // Constructor // // Parameters // context The context where the View associated with this SimpleAdapter is running // 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" // resource Resource identifier of a view layout that defines the views for this list item. The layout // file should include at least those named views defined in "to" // from A list of column names that will be added to the Map associated with each item. // to The views that should display column in the "from" parameter. These should all be TextViews. // The first N views in this list are given the values of the first N columns in the from parameter. la = new SimpleAdapter(this,getData(),R.layout.item,new String[]{"pic","text"},new int[]{R.id.pic,R.id.text}); listview.setAdapter(la); } private List<Map<String, Object>> getData() { List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); Map map = new HashMap<String,Object>(); for(int i=0;i<10;i++){ map.put("pic", R.drawable.ic_launcher); map.put("text", "wyl"+i); System.out.println("i:"+i); list.add(map); } return list; } }
xml:
<?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="horizontal" > <ImageView android:id="@+id/pic" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="15dp" android:src="@drawable/ic_launcher" /> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20sp" android:textColor="#000000" android:text="demo" /> </LinearLayout>
PS:SimpleAdapter的构造方法的参数解释:
new SimpleAdapter(context,data,resource,from,to)
context: 上下文
data: 数据源(List<? extends Map<String,?>>data) 一个Map所组成的List集合
每一个Map都会去对应ListView列表中的一行
每一个Map(键 - 值对)中的键必须包含所有在from中所指定的值
resource: 列表项的布局文件ID
from: Map中的键名
to: 绑定数据视图中的ID,与from成对应关系
-----------------------------------
context:一般指当前的activity,用this即可;
data:一个数据源,本课程的重点,创建Map并添加信息;
resource:一个布局文件ID,表示listview中每一个item的布局方式;
from:Map的键名,listview中的item内部元素对应的名字;
to:resource布局文件中,每个元素的ID。
这里说说我自己对这这五个参数的理解。
我们可以发现,第三个参数和第五个参数都跟所要显示出来的具体有关,如左侧显示图片,右侧显示备注。可能我们会想,为什么
已经有了第五个参数,即那个图片和备注的R.id.xx属性的数组,那为什么还要再加上第三个参数resouce呢?有了更具体的的R.id.xx属性
那么我们就能够知道这个数组所表示的属性所在的layout布局了,也就完全没必要再给出第二个参数了。其实问题就出在这里,因为第五个
参数是一个int 类型的数组,在安卓系统根不知道这些数字到底是对应着文字或者图片。如果没有第三个参数,那么android就不知道本例
中第三个参数数组中的下标为0的对应的是图片,那么系统只能够根据第二个参数绑定的值,即
map.put("pic", R.drawable.ic_launcher);
这行代码中的R.drawable.ic_launcher,这个值实际上是一个16进制数,在gen.具体包名.R.java中的
public static final class drawable { public static final int ic_launcher=0x7f020000; public static final int yl=0x7f020001; }
这行代码中的0x7f020000这个16进制数,对应的10进制为:2130837504,那么运行这个安卓应用时显示的不是图片,而这个10进制
数:2130837504。
由此:我们要特别注意:第3,4,5个参数一一对应。如果不对应起来可能发生意想不到的结果。
有个具体的例子的图如下: