在android开发中,listview是比较常用的一个组件,它以列表的形式显示数据。列表显示需要三个元素:
1、listview用来显示具体列表的view
2、XXAdapter适配器用来把具体的数据映射到listview
3、具体需要展示的数据,比如文字,图片,按钮等组件
listview的适配器类型主要分为三种:ArrayAdapter、SimpleAdapter、SimpleCursorAdapter。
ArrayAdapter比较简单,只能显示一行文字,SimpleAdapter扩充性很好,可以自己定义出很多种效果,SimpleCursorAdapter可以和数据库很好的结合,把数据库中的表的内容展示到列表上。
有些时候,由于我们需要展示的数据量很大,而且也需要美化显示的效果,这时我们就需要自定义一个适配器,只需继承BaseAdapter,实现它的四个方法。listview在开始绘制的时候,首先调用getCount()方法,得到需要绘制的item数量,再调用getView绘制每一个item,每调用一次getView都会实例化一个view对象,因此对于显示大量数据的时候,必须进行优化。下面是一个小例子,getView方法对listview进行了一定的优化,当listview的某一项被选择或者点击时,更换该项的背景图片。源码如下:
ListViewActivity.java
package com.alex.activity;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.AdapterView.OnItemSelectedListener;
public class ListViewActivity extends Activity {
/** Called when the activity is first created. */
private List<Map<String, Object>> datas = null; //存放初始化数据
private ListView roomListView = null;
//Button back;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//去除窗口的title区域
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
//全屏显示
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
this.setContentView(R.layout.listview);
initDatas();
findViews();
}
private void initDatas() {
datas = new ArrayList<Map<String,Object>>();
for(int i=0;i<12;i++) {
Map<String, Object> itemMap = new HashMap<String,Object>();
itemMap.put("data", "测试数据"+i);
datas.add(itemMap);
}
}
private void findViews() {
roomListView = (ListView)findViewById(R.id.room_list);
roomListView.setAdapter(new MyListViewAdapter(this));
roomListView.setVerticalScrollBarEnabled(true); //显示垂直滚动条
roomListView.setSelection(0); //默认选中第一项
}
public class MyListViewAdapter extends BaseAdapter {
private LayoutInflater mInflater; //作用:把xml布局文件实例化成View
public MyListViewAdapter(Context context) {
this.mInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return datas.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if(convertView == null) {
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.list_row, null);
convertView.setBackgroundResource(R.drawable.dtht_1);
holder.data = (TextView)convertView.findViewById(R.id.data);
convertView.setTag(holder);
}
else {
holder = (ViewHolder)convertView.getTag();
}
holder.data.setText(String.valueOf(datas.get(position).get("data")));
return convertView;
}
}
public final class ViewHolder {
TextView data;
}
}
listview.xml
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ListView android:id="@+id/room_list" android:layout_width="fill_parent" android:layout_height="fill_parent" android:listSelector="@drawable/dtht_2" android:background="@drawable/dtht_1" android:cacheColorHint="#00000000" android:divider="#00000000" android:dividerHeight="1dip" /> </LinearLayout> </FrameLayout>
list_row.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"> <TextView android:id="@+id/data" android:layout_width="fill_parent" android:layout_height="36dip" android:layout_alignParentLeft="true" android:gravity="center" android:textColor="#ffffff" /> </RelativeLayout>
效果图见附件