<转载请注明文件出处:>
要想实现自定义ListView,首先需要自定义一个listView的单元布局。下面是一个布局实例:
<?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:layout_width="wrap_content"
android:layout_height="32dp"
android:id="@+id/imageView"/>
<TextView
android:layout_width="120dp"
android:layout_height="35dp"
android:textSize="22sp"
android:text="2008-12-12"
android:gravity="center"
android:paddingRight="5dp"
android:id="@+id/dateView"
/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12sp"
android:text="类型:" />
<TextView
android:layout_width="40dp"
android:layout_height="wrap_content"
android:textSize="10sp"
android:id="@+id/typeView" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12sp"
android:text="金额:" />
<TextView
android:layout_width="40dp"
android:layout_height="wrap_content"
android:textSize="10sp"
android:id="@+id/moneyView" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
利用该布局实现的效果如下
我们需要通过一个自定义的Adapter(通常,这个Adapter继承自BaseAdapter)和 List<Map<K,V>>来设置ListView数据。
自定义的Adapter关键代码
public View getView(int position, View convertView, ViewGroup parent) {
inflater = LayoutInflater.from(this.context);
convertView = inflater.inflate(R.layout.list_items, null);
ListView listView = null;
if (listView == null) {
Log.v("position",Integer.toString(position));
listView = new ListView();
//控件实例化
listView.dateView = (TextView) convertView
.findViewById(R.id.dateView);
listView.typeView = (TextView) convertView
.findViewById(R.id.typeView);
listView.moneyView = (TextView) convertView
.findViewById(R.id.moneyView);
//设置控件数据,数据源来自List<Map<K,V>>
listView.dateView.setText((String) dataList.get(position).get(
DBtest.DATA_NAME));
listView.typeView.setText((String) dataList.get(position).get(
DBtest.TYPE_NAME));
listView.moneyView.setText((String) dataList.get(position).get(
DBtest.MONEY_NAME));
Log.v("money",listView.moneyView.getText().toString());
} else {
listView = (ListView) convertView.getTag();
}
convertView.setTag(listView);
//convertView用于在ListView中显示
return convertView;
}
数据源部分
Cursor cursor = cursor = DateBaseTestActivity.mDatabase.rawQuery(
"SELECT *FROM " + DBtest.TABLE_NAME, null);
Log.v("cursor", Integer.toString(cursor.getCount()));
cursor.moveToFirst();
do {
Map<String, Object> map = new HashMap<String, Object>();
int data_id = cursor.getColumnIndex(DBtest.DATA_NAME);
int type_id = cursor.getColumnIndex(DBtest.TYPE_NAME);
int money_id = cursor.getColumnIndex(DBtest.MONEY_NAME);
String dataString = cursor.getString(data_id);
String typeString = cursor.getString(type_id);
String moneyString = cursor.getString(money_id);
Log.v("isEMpry",moneyString );
map.put(DBtest.DATA_NAME, dataString);
map.put(DBtest.TYPE_NAME, typeString);
map.put(DBtest.MONEY_NAME, moneyString);
Log.v("map",(String)map.get(DBtest.MONEY_NAME));
list.add(map);
} while (cursor.moveToNext());
将数据库中的数据读取到List中。
public ListViewAdapter getAdapter(List<Map<String, Object>> dataList) {
Log.v("test", "ok");
ListViewAdapter mAdapter = new ListViewAdapter(this, dataList);
Log.v("test", Integer.toString(mAdapter.getCount()));
return mAdapter;
}
方法getAdapter利用我们获得的这个list初始化一个ListViewAdapter(这是我自定义的adapter)。
备注1:使用Cursor时,需要注意越界检查。 使用完后,请关闭。
备注2:ListView的长度由List<Map<K,V>>的长度决定。