上篇利用LIstView实现了一个简单的例子,这篇以一个更贴近项目的例子来分享一下ListView的使用方法,模拟疼痛的微信客户端list界面.
先看看实现效果:
工程结构目录:
这个案例中使用自定义的item.xml布局文件,在Activity中使用simpleAdapter和它的setViewBinder()方法来配置和绑定数据。
以下是源代码:
首先看一下布局文件
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ListView
android:paddingTop="10dip"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/MyListView"/>
</LinearLayout>
item.xml (采用线性布局,利用weight权重属性控制显示比例)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/MyListItem"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingTop="5dip"
android:orientation="horizontal" >
<LinearLayout
android:id="@+id/ItemPic"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="left"
android:layout_weight="5">
<ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_weight="1">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:layout_weight="1">
<TextView
android:id="@+id/name"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="15dip"
android:textColor="@android:color/white"
android:layout_weight="1"/>
<TextView
android:id="@+id/time"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="12dip"
android:textColor="@android:color/tertiary_text_light"
android:layout_weight="3"/>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:layout_weight="1">
<TextView
android:id="@+id/content"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="@android:color/tertiary_text_light"
android:textSize="12dip" >
</TextView>
</LinearLayout>
</LinearLayout>
</LinearLayout>
MyData.java (放置模拟数据)
package com.test.activity;
public class MyData {
//头像数组
public static int[] images = new int[]{
R.drawable.pic001,R.drawable.pic002,R.drawable.pic003,R.drawable.pic004,
R.drawable.pic005,R.drawable.pic006,R.drawable.pic007,R.drawable.pic008,
R.drawable.pic009,R.drawable.pic010,R.drawable.pic011,R.drawable.pic012,
R.drawable.pic013,R.drawable.pic014,R.drawable.pic015,R.drawable.pic016
};
//昵称数组
public static String[] names = new String[]{
"爱~未字","心海贝因","初音未来","麻子","英子","飞来耶老师","萌海连上","lovvww",
"love story","功夫只","海盗","玩那个","青蛙昂子","暮烟","孩子们","钢琴师"
};
//时间数组
public static String[] times = new String[]{
"凌晨00:23","19:00","19:04","昨天14:20","下午15:56","中午12:43","周一 晚上","周一 晚上",
"昨天10:23","周四 19:00","周五19:04","昨天14:20","凌晨01:56","中午11:43","周一 早上","周四中午"
};
//会话数组
public static String[] contents = new String[]{
"我喜欢你!","晚上好在,在忙什么呢?","不可以,我会所了","这是一场永不不停息的战争","嗯,行!","OK的啦","加油告白","开心快乐",
"新年快乐!恭喜发财","恭喜发财!快拿红包来","命运的签或者改变不了","不能说的秘密","I Gusss","Say it right","NONNO","周周年"
};
}
MainActivity.java (重头戏)
package com.test.activity;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import com.test.activity.*;
import android.app.Activity;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.SimpleAdapter.ViewBinder;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ListView listView = (ListView)findViewById(R.id.MyListView);
System.out.println(listView);
Log.i("MainActivity", "111");
//生成适配器,数组
ArrayList<HashMap<String,Object>> dataList = new ArrayList<HashMap<String,Object>>();
for(int i=0;i<16;i++)
{
HashMap<String, Object> map = new HashMap<String, Object>();
Resources res=getResources();
//将Drawable图片资源转化为Bitmap对象
Bitmap bmp=BitmapFactory.decodeResource(res, MyData.images[i]);
map.put("image", bmp);
map.put("name", MyData.names[i]);
map.put("time", MyData.times[i]);
map.put("content", MyData.contents[i]);
dataList.add(map);
}
//生成适配器,数组
SimpleAdapter simpleAdapter = new SimpleAdapter(MainActivity.this, dataList, R.layout.item,
new String[]{"image","name","time","content"}, new int[]{R.id.image,R.id.name,R.id.time,R.id.content});
//绑定数据到listView
simpleAdapter.setViewBinder(new ViewBinder() {
public boolean setViewValue(View view, Object data,
String textRepresentation) {
//判断是否为我们要处理的对象
if(view instanceof ImageView && data instanceof Bitmap){
ImageView iv = (ImageView) view;
iv.setImageBitmap((Bitmap) data);
return true;
}else
return false;
}
});
listView.setAdapter(simpleAdapter);
}
}