Json字符串绑定自定义ListView
先看效果图:
客户端(手机)从服务器检索数据时,服务器检索的结果集resultSet属于重量级的数据结构。所以大伙都将resultSet转变为JSon字符串,瘦身后再传给客户端。
JSon字符串的格式如下:
private String str_Json= " {\"result\":["
+"{\"user_name\":\"admin\",\"user_phone\":\"13612341234\",\"user_id\":\"1\"},"
+"{\"user_name\":\"张三\",\"user_phone\":\"13612341235\",\"user_id\":\"2\"},"
+"{\"user_name\":\"李四\",\"user_phone\":\"13612341236\",\"user_id\":\"3\"}"
+"]}";
注:斜杠是转义符,不知道的问度娘。
不啰嗦了,直接上代码了。
publicclass MainActivity extends Activity {
private ListView listView;
private String str_Json = " {\"result\": ["
+"{\"user_name\":\"admin\",\"user_phone\":\"13612341234\",\"user_id\":\"1\"},"
+"{\"user_name\":\"张三\",\"user_phone\":\"13612341235\",\"user_id\":\"2\"},"
+"{\"user_name\":\"李四\",\"user_phone\":\"13612341236\",\"user_id\":\"3\"}"
+ "]}";
@Override
protected void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.i("infoinfo","str_json:" + str_Json);
listView = (ListView)findViewById(R.id.listView1);
List<Map<String, Object>>list = getData();
listView.setAdapter(new MyAdspter(this,list));
return;
}
private List<Map<String, Object>>getData() {
List<Map<String, Object>>list = new ArrayList<Map<String, Object>>();
try {
JSONObject jsonObject = newJSONObject(str_Json);
JSONArray aNews = newJSONArray(jsonObject.getString("result"));
for (int i = 0; i <aNews.length(); i++) {
Map<String, Object>map = new HashMap<String, Object>();
map.put("user_id",aNews.getJSONObject(i).getString("user_id"));
map.put("user_name",
aNews.getJSONObject(i).getString("user_name"));
map.put("user_phone",
aNews.getJSONObject(i).getString("user_phone"));
list.add(map);
}
} catch (JSONException ex) {
Log.i("infoinfo","JSON Error: " + ex.toString());
}
return list;
}
}
自定义显示行的XML文件是非常简单的,这里不啰嗦了。
最难的是适配器,我是扒网上的,大伙参考一下就好。
public classMyAdspter extendsBaseAdapter {
private int[] imgesIds = new int[]{R.drawable.id01,R.drawable.id02,
R.drawable.id03,R.drawable.id04,R.drawable.id05};
privateList<Map<String, Object>> data;
privateLayoutInflater layoutInflater;
privateContext context;
publicMyAdspter(Context context,List<Map<String, Object>> data){
this.context=context;
this.data=data;
this.layoutInflater=LayoutInflater.from(context);
}
/**
* 组件集合,对应list.xml中的控件
* @author Administrator
*/
publicfinalclassZujian{
public ImageView img_id;
public TextView tv_id;
public TextView tv_name;
public TextView tv_phone;
}
@Override
publicintgetCount() {
return data.size();
}
/**
* 获得某一位置的数据
*/
@Override
publicObject getItem(intposition) {
return data.get(position);
}
/**
* 获得唯一标识
*/
@Override
publiclonggetItemId(intposition) {
return position;
}
@Override
publicView getView(intposition, View convertView, ViewGroup parent) {
Zujian zujian=null;
if(convertView==null){
zujian=new Zujian();
//获得组件,实例化组件
convertView=layoutInflater.inflate(R.layout.custom_user, null);
zujian.img_id =(ImageView) convertView.findViewById(R.id.imageView1);
zujian.tv_id=(TextView)convertView.findViewById(R.id.tv_user_id);
zujian.tv_name=(TextView)convertView.findViewById(R.id.tv_user_name);
zujian.tv_phone=(TextView)convertView.findViewById(R.id.tv_user_phone);
convertView.setTag(zujian);
}else{
zujian=(Zujian)convertView.getTag();
}
//绑定数据
zujian.img_id.setImageResource(imgesIds[position]);
zujian.tv_id.setText((String)data.get(position).get("user_id"));
zujian.tv_name.setText((String)data.get(position).get("user_name"));
zujian.tv_phone.setText((String)data.get(position).get("user_phone"));
return convertView;
}
}
ListView本身是可以纵向滑动的。如果嵌套在横向滑动控件就能实现双向滑动。对于展示数据是非常适合的。