ListView的Adapter使用(绑定数据) 之 自定义每一项的布局去绑定数据
程序员文章站
2023-11-12 10:04:58
大家先看第一个例子显示:
这个界面相信大家都看到过的,这次比上一个例子多的是listview 的每一项绑定的是不再是单纯的一个字符串了,listview 的每一个条...
大家先看第一个例子显示:
/** *
*/ package com.cz.list.demo;
import java.util.arraylist;
import java.util.hashmap;
import android.app.activity; import android.os.bundle;
import android.widget.listview; import android.widget.simpleadapter;
/**
* @author cz *
*/ public class simpleadapterlistdemo extends activity {
private listview listview;
/* * (non-javadoc)
* * @see android.app.activity#oncreate(android.os.bundle)
*/ @override
protected void oncreate(bundle savedinstancestate) { // todo auto-generated method stub
super.oncreate(savedinstancestate); setcontentview(r.layout.array_list_layout);
listview = (listview) findviewbyid(r.id.array_list);
simpleadapter simpleadapter = new simpleadapter( simpleadapterlistdemo.this, gethashmapdata(),
android.r.layout.simple_list_item_2, new string[] { "id", "name" }, new int[] { android.r.id.text1,
android.r.id.text2 }); listview.setadapter(simpleadapter);
}
/** *
* @return year:2011 date:2011-10-23 time:下午05:45:38 author:cz todo * 写一个方法去绑定十条数据
*/ private arraylist<hashmap<string, object>> gethashmapdata() {
arraylist<hashmap<string, object>> hashdata = new arraylist<hashmap<string, object>>(); for (int i = 0; i < 10; i++) {
hashmap<string, object> mitem = new hashmap<string, object>(); mitem.put("id", "当前的id是" + i);
mitem.put("name", "名字是美女" + i); hashdata.add(mitem);
} return hashdata;
}
}
这个adapter直接用的是simpleadapter,构造函数中有五个参数,可以看下:
android.widget.simpleadapter.simpleadapter(context context, list<? extends map<string, ?>> data, int resource, string[] from, int[] to)
构造函数中有五个参数,
第一个是context引用对象,
第二个参数就是我们要显示的数据集list,
第三个参数是int 类型的,是我们每一条的自定义布局,程序中我们用到的是android中自带的布局,所以用android.r.layout.list_item_2来引用,如果是我们自定义的布局,就直接用r.layout.xx引用就好。
第四个参数跟第五个参数需要一起理解,从字面的意思理解,from to 就是把第四个参数里面的数据显示到第五个参数中。 第二个参数是我们要显示的数据集,每条数据都是用哈希map 来定义的,里面有定义的作为key 的字段,id,name, 有这样一个映射的关系,第四个参数中的key 值映射到第五个参数中相对应的textview 上面,那么这些textview 是从哪里来的,是第三个参数中 布局文件中的textview,这四个参数中可以这样理解.
希望大家这时候可以理解。
接下来是自定义布局的例子,但是因为我第一次写完提交的时候提示字符超过8万,粘有贴错了东西,让我不禁在心里发下牢骚,编辑器有待提高啊..
<?xml version="1.0" encoding="utf-8"?> <relativelayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"> <imageview android:id="@+id/imageview" android:layout_width="48dip"
android:layout_height="48dip" android:scaletype="fitcenter" android:adjustviewbounds="true" android:layout_alignparentleft="true"
android:layout_margin="5dip"></imageview> <textview android:id="@+id/number" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:textsize="14dip" android:layout_torightof="@+id/imageview" android:layout_aligntop="@+id/imageview"></textview>
<textview android:id="@+id/name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textsize="10dip"
android:layout_torightof="@+id/imageview" android:layout_below="@+id/number"></textview> </relativelayout>
2. 我们程序中的代码:
/** *
*/ package com.cz.list.demo;
import java.util.arraylist;
import java.util.hashmap;
import android.app.activity; import android.content.context;
import android.os.bundle; import android.util.log;
import android.view.layoutinflater; import android.view.view;
import android.view.viewgroup; import android.widget.imageview;
import android.widget.listview; import android.widget.simpleadapter;
import android.widget.textview;
/** * @author cz
* */
public class customsimpleadapterdemo extends activity { private listview listview;
@override
protected void oncreate(bundle savedinstancestate) { // todo auto-generated method stub
super.oncreate(savedinstancestate); setcontentview(r.layout.array_list_layout);
listview = (listview) findviewbyid(r.id.array_list);
customsimpleadapter customsimpleadapter = new customsimpleadapter( customsimpleadapterdemo.this, gethashmapdata(),
r.layout.custom_list_layout);
listview.setadapter(customsimpleadapter); }
/**
* * @author cz
* 自定义的类去继承simpleadapter */
private class customsimpleadapter extends simpleadapter { private context context;
private arraylist<hashmap<string, object>> data; private int layoutresource;
/**
* @param context * @param data
* @param resource * @param from
* @param to 构造函数 */
public customsimpleadapter(context context, arraylist<hashmap<string, object>> data, int resource) {
super(context, data, resource, null, null); this.context = context;
this.data = data; this.layoutresource = resource;
}
class viewholder { imageview picture;
textview number; textview name;
}
/* * (non-javadoc)
* * @see android.widget.simpleadapter#getview(int, android.view.view,
* android.view.viewgroup) */
@override public view getview(int position, view convertview, viewgroup parent) {
layoutinflater layoutinflater = (layoutinflater) getsystemservice(layout_inflater_service); view layoutview = layoutinflater.inflate(layoutresource, null);
viewholder viewholder = new viewholder(); viewholder.picture = (imageview) layoutview
.findviewbyid(r.id.imageview); viewholder.number = (textview) layoutview.findviewbyid(r.id.number);
viewholder.name = (textview) layoutview.findviewbyid(r.id.name);
viewholder.picture.setimageresource(integer.parseint(data.get( position).get("imageview").tostring()));
viewholder.number.settext(data.get(position).get("id").tostring()); log.e("id", data.get(position).get("name").tostring());
viewholder.name.settext(data.get(position).get("name").tostring()); return layoutview;
} }
/**
* * @return
* year:2011 date:2011-10-23 time:下午05:46:45 * author:cz
* todo 自定义的方法绑定数据,为了避免图片全部都一样,我们让三张图片循环绑定。 */
private arraylist<hashmap<string, object>> gethashmapdata() { arraylist<hashmap<string, object>> hashdata = new arraylist<hashmap<string, object>>();
for (int i = 0; i < 10; i++) { hashmap<string, object> mitem = new hashmap<string, object>();
mitem.put("id", "当前的编号是:" + i); mitem.put("name", "名字是美女" + i);
switch (i % 3) { case 0:
mitem.put("imageview", r.drawable.test1); break;
case 1: mitem.put("imageview", r.drawable.test2);
break; case 2:
mitem.put("imageview", r.drawable.test3); break;
default: mitem.put("imageview", r.drawable.test4);
break; }
hashdata.add(mitem); }
return hashdata;
}
}
有了之前的例子做基础,这时候看起来是不是会清楚一些呢,绑定数据是一样的,只不过是多绑定了图片的数据。
然后我们重写了simpleadapter, 构造函数我们自己定义参数,需要说明的是:
1) getview() 方法返回是的是一个view值,我们绑定完数据之后,把这个view返回
2) 我们自己写的layout,要先通过转化,转化成为一个view, 找到她里面对应的textview,然后取出list 表中相对应位置的hashmap,取出数据显示到相应的imageview 和textview上面.
希望对新手有所帮助..
这个界面相信大家都看到过的,这次比上一个例子多的是listview 的每一项绑定的是不再是单纯的一个字符串了,listview 的每一个条目我们需要显示两个信息,编号和姓名.可以看到,我们绑定了十条数据,用了一个for 循环,每一条绑定的时候创建一个hashmap,然后往里面放数据,放的数据有相对应的key, 即id,name,到时候我们取数据的时候就根据这个key 找到我们放进去的数据,有点类似与键值对的意思,不知道这样解释大家明白不明白。
贴上源代码,然后接下来讲解:
复制代码 代码如下:
/** *
*/ package com.cz.list.demo;
import java.util.arraylist;
import java.util.hashmap;
import android.app.activity; import android.os.bundle;
import android.widget.listview; import android.widget.simpleadapter;
/**
* @author cz *
*/ public class simpleadapterlistdemo extends activity {
private listview listview;
/* * (non-javadoc)
* * @see android.app.activity#oncreate(android.os.bundle)
*/ @override
protected void oncreate(bundle savedinstancestate) { // todo auto-generated method stub
super.oncreate(savedinstancestate); setcontentview(r.layout.array_list_layout);
listview = (listview) findviewbyid(r.id.array_list);
simpleadapter simpleadapter = new simpleadapter( simpleadapterlistdemo.this, gethashmapdata(),
android.r.layout.simple_list_item_2, new string[] { "id", "name" }, new int[] { android.r.id.text1,
android.r.id.text2 }); listview.setadapter(simpleadapter);
}
/** *
* @return year:2011 date:2011-10-23 time:下午05:45:38 author:cz todo * 写一个方法去绑定十条数据
*/ private arraylist<hashmap<string, object>> gethashmapdata() {
arraylist<hashmap<string, object>> hashdata = new arraylist<hashmap<string, object>>(); for (int i = 0; i < 10; i++) {
hashmap<string, object> mitem = new hashmap<string, object>(); mitem.put("id", "当前的id是" + i);
mitem.put("name", "名字是美女" + i); hashdata.add(mitem);
} return hashdata;
}
}
这个adapter直接用的是simpleadapter,构造函数中有五个参数,可以看下:
android.widget.simpleadapter.simpleadapter(context context, list<? extends map<string, ?>> data, int resource, string[] from, int[] to)
构造函数中有五个参数,
第一个是context引用对象,
第二个参数就是我们要显示的数据集list,
第三个参数是int 类型的,是我们每一条的自定义布局,程序中我们用到的是android中自带的布局,所以用android.r.layout.list_item_2来引用,如果是我们自定义的布局,就直接用r.layout.xx引用就好。
第四个参数跟第五个参数需要一起理解,从字面的意思理解,from to 就是把第四个参数里面的数据显示到第五个参数中。 第二个参数是我们要显示的数据集,每条数据都是用哈希map 来定义的,里面有定义的作为key 的字段,id,name, 有这样一个映射的关系,第四个参数中的key 值映射到第五个参数中相对应的textview 上面,那么这些textview 是从哪里来的,是第三个参数中 布局文件中的textview,这四个参数中可以这样理解.
希望大家这时候可以理解。
接下来是自定义布局的例子,但是因为我第一次写完提交的时候提示字符超过8万,粘有贴错了东西,让我不禁在心里发下牢骚,编辑器有待提高啊..
接下来是自定义布局的例子,我们大家先看下程序出来的效果图:
代码是:
1. 首先自定义布局,我们命名一个custom_list_layout.xml的布局文件,代码如下:
复制代码 代码如下:
<?xml version="1.0" encoding="utf-8"?> <relativelayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"> <imageview android:id="@+id/imageview" android:layout_width="48dip"
android:layout_height="48dip" android:scaletype="fitcenter" android:adjustviewbounds="true" android:layout_alignparentleft="true"
android:layout_margin="5dip"></imageview> <textview android:id="@+id/number" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:textsize="14dip" android:layout_torightof="@+id/imageview" android:layout_aligntop="@+id/imageview"></textview>
<textview android:id="@+id/name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textsize="10dip"
android:layout_torightof="@+id/imageview" android:layout_below="@+id/number"></textview> </relativelayout>
2. 我们程序中的代码:
复制代码 代码如下:
/** *
*/ package com.cz.list.demo;
import java.util.arraylist;
import java.util.hashmap;
import android.app.activity; import android.content.context;
import android.os.bundle; import android.util.log;
import android.view.layoutinflater; import android.view.view;
import android.view.viewgroup; import android.widget.imageview;
import android.widget.listview; import android.widget.simpleadapter;
import android.widget.textview;
/** * @author cz
* */
public class customsimpleadapterdemo extends activity { private listview listview;
@override
protected void oncreate(bundle savedinstancestate) { // todo auto-generated method stub
super.oncreate(savedinstancestate); setcontentview(r.layout.array_list_layout);
listview = (listview) findviewbyid(r.id.array_list);
customsimpleadapter customsimpleadapter = new customsimpleadapter( customsimpleadapterdemo.this, gethashmapdata(),
r.layout.custom_list_layout);
listview.setadapter(customsimpleadapter); }
/**
* * @author cz
* 自定义的类去继承simpleadapter */
private class customsimpleadapter extends simpleadapter { private context context;
private arraylist<hashmap<string, object>> data; private int layoutresource;
/**
* @param context * @param data
* @param resource * @param from
* @param to 构造函数 */
public customsimpleadapter(context context, arraylist<hashmap<string, object>> data, int resource) {
super(context, data, resource, null, null); this.context = context;
this.data = data; this.layoutresource = resource;
}
class viewholder { imageview picture;
textview number; textview name;
}
/* * (non-javadoc)
* * @see android.widget.simpleadapter#getview(int, android.view.view,
* android.view.viewgroup) */
@override public view getview(int position, view convertview, viewgroup parent) {
layoutinflater layoutinflater = (layoutinflater) getsystemservice(layout_inflater_service); view layoutview = layoutinflater.inflate(layoutresource, null);
viewholder viewholder = new viewholder(); viewholder.picture = (imageview) layoutview
.findviewbyid(r.id.imageview); viewholder.number = (textview) layoutview.findviewbyid(r.id.number);
viewholder.name = (textview) layoutview.findviewbyid(r.id.name);
viewholder.picture.setimageresource(integer.parseint(data.get( position).get("imageview").tostring()));
viewholder.number.settext(data.get(position).get("id").tostring()); log.e("id", data.get(position).get("name").tostring());
viewholder.name.settext(data.get(position).get("name").tostring()); return layoutview;
} }
/**
* * @return
* year:2011 date:2011-10-23 time:下午05:46:45 * author:cz
* todo 自定义的方法绑定数据,为了避免图片全部都一样,我们让三张图片循环绑定。 */
private arraylist<hashmap<string, object>> gethashmapdata() { arraylist<hashmap<string, object>> hashdata = new arraylist<hashmap<string, object>>();
for (int i = 0; i < 10; i++) { hashmap<string, object> mitem = new hashmap<string, object>();
mitem.put("id", "当前的编号是:" + i); mitem.put("name", "名字是美女" + i);
switch (i % 3) { case 0:
mitem.put("imageview", r.drawable.test1); break;
case 1: mitem.put("imageview", r.drawable.test2);
break; case 2:
mitem.put("imageview", r.drawable.test3); break;
default: mitem.put("imageview", r.drawable.test4);
break; }
hashdata.add(mitem); }
return hashdata;
}
}
有了之前的例子做基础,这时候看起来是不是会清楚一些呢,绑定数据是一样的,只不过是多绑定了图片的数据。
然后我们重写了simpleadapter, 构造函数我们自己定义参数,需要说明的是:
1) getview() 方法返回是的是一个view值,我们绑定完数据之后,把这个view返回
2) 我们自己写的layout,要先通过转化,转化成为一个view, 找到她里面对应的textview,然后取出list 表中相对应位置的hashmap,取出数据显示到相应的imageview 和textview上面.
希望对新手有所帮助..
上一篇: PHP实现的json类实例