上一篇文章中已经说明了简单的ListView的使用方式,但是在实际运用中,例如QQ的List上不仅要显示昵称还要显示头像,那么此时,就可以使用自定义ListView来实现了。自定义ListView其实就是自定义一个ListView的Item显示对于这类需求,需要在项目文件的 layout
下建立一个辅助xml布局文件,例如这里建立一个person.xml
将要显示的数据存入Map并形成List集合,使用SinpleAdapter将person.xml文件以及数据源List<Map>??组合起来(代码中已经有注释)这里要显示的图片必须实现放入 res/drawable目录中
步骤:
-
创建Model 并在Layout布局文件上创建一个ListView节点设定id为listview
-
创建自定义布局文件 person.xml
-
在Layout文件夹右键点击选择新建->Layout resource file在弹出框中输入名称
-
内如如下:
<?xmlversion="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"android:layout_width="match_parent"
android:layout_height="match_parent"
>
<ImageView
android:layout_width="48dip"
android:layout_height="48dip"
android:id="@+id/icon"
/>
<TextView
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_gravity="center_vertical"
android:id="@+id/text"
/>
</LinearLayout>
-
3.在Activity中添如下代码:
private ListViewlistView;//声明一个ListView
privateList<HashMap<String,Object>> data = newArrayList<HashMap<String,Object>>(); //存放显示在listview上的键值对
private HashMap<String,Object> info =new HashMap<String,Object>();//存放一个实体
@Override
protected void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_usernavtools);
listView = (ListView)findViewById(R.id.listview);
//将头像和姓名放入Map
info.put("img",R.drawable.icon1);//放入图片
info.put("name","少司命");
data.add(info);//放入list
SimpleAdapter adapter = newSimpleAdapter(usernavtools.this,data,R.layout.person,newString[]{"img","name"},new int[]{R.id.icon,R.id.text});
//参数解释 (context:上下文,data:数据来源,resource:自定义布局来源,from:数据索引,也就是Map中的键集合,to:要显示的地方比如 icon要显示在自定义布局的person的icon上
// 而 name要显示在 person的text上)
//将适配器与listView关联
listView.setAdapter(adapter);
//给ListView设置单击列表的监听器
listView.setOnItemClickListener(newAdapterView.OnItemClickListener() {
@Override
public voidonItemClick(AdapterView<?> parent, View view, int position, long id) {
HashMap<String,Object>info = data.get(position);//获取list中当前点击的item
String name = (String)info.get("name");
Toast.makeText(usernavtools.this,name,Toast.LENGTH_SHORT).show();
}
});
}
这里用到了SimpleAdapter适配器其构造方法:
参数解释 (context:上下文,data:数据来源,resource:自定义布局来源,from:数据索引,也就是Map中的键集合,to:要显示的地方比如 icon要显示在自定义布局的 person的icon上
单击列表的监听器 OnItemClickListener中的onItemClick方法中有4个参数,
第一个参数:相当于ListView的指针,可以通过它来获取这个ListVIew中的所有内容
第二个参数:view是当前单击的列表项中的对象句柄,可以用此获取ListView上这个组件的id并对其操作
第三个参数:是列表项在适配器里的位置,可以理解为从上到下的流水号
第四个参数:是列表在ListView组件里的第几行位置
完成结果如下: