在应用程序中常常出现这样的activity,有多条信息,每一条信息有标识图片、标题等内容,比如新闻菜单、设置选项qq好友选项等等,使用组件ListView可以实现这样的功能
如何实现一个这样的ListView:
1 创建ListViewActivity类(当然也可以继承一般的Activity,但是需要在类中自定义一个ListView)
需要注意的是,如果要使用自定义的布局,则需要通过setContentView(int id);和xml配置文件实现通信,xml配置见后文第三步
public class PictureAndTxtListAty extends ListActivity implements OnItemClickListener{
private TextView tv;
private PicAndTxtListViewAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.picandtext_listview);
//设置适配器
adapter = new PicAndTxtListViewAdapter(this);
setListAdapter(adapter);
//创建组件实例
tv = (TextView) findViewById(R.id.title_pat);
//为每一栏添加响应
this.getListView().setOnItemClickListener(this);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
PicAndTxtCell data = adapter.getItem(position);
Toast.makeText(this,String.format("姓名:%s 生日:%s",data.name,data.date),Toast.LENGTH_SHORT).show();
}
}
其中toast会出现这样一个提示栏的效果
2 在AndroidManifest.xml文件中配置相关节点,如果需要以本Activity为应用程序第一个界面,则
需要在其<Intent filter>中做相关配置
<activity
android:name="com.yunxiang.diandi.activitys.PictureAndTxtListAty"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
3 为ListViewActity配置布局(如果需要的话)
<1>创建相关xxx_listview.xml,不过需要注意的是这个xml文件中一定要包含一个ListView组件,而且使用系统提供的id: android:id="@android:id/list"
<2>配置布局,添加需要的组建:textview button等
<?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="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/title_pat"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text=" XXXXXXX" />
<ListView
android:id="@android:id/list"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
</ListView>
</LinearLayout>
4 创建每一栏的数据类,用来临时储存每一栏的有关信息
public class PicAndTxtCell {
public PicAndTxtCell(String name,String date,int id)
{
this.name=name;
this.date=date;
this.iconId=id;
}
public String name="";
public String date="";
public int iconId=0;
}
5 创建cell_layout xml文件为每一栏配置布局,这里采用的是图标+列表的形式
<?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="wrap_content"
android:orientation="horizontal"
android:id="@+id/pat_listcell" >
<ImageView
android:layout_width="90dp"
android:layout_height="90dp"
android:id="@+id/icon">
</ImageView>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical" >
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Name"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+id/description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Description" />
</LinearLayout>
</LinearLayout>
6 创建BaseAdapter类,完成总表的控制
关于BaseAdapter的说明
<1>有4个必须实现的抽象方法
public int getCount();
用来返回列表元素的总数量
public PicAndTxtCell getItem(int position);
返回数据元
public long getItemId(int position);
返回数据元ID
public View getView(int position, View convertView, ViewGroup parent);
返回一栏给ListView
position是一个迭代器,用于遍历源数据集
convertView 是安卓平台提供的内存优化机制,类似与可利用线性表的作用,从对象池中重新引用废弃对象,从而不用重新创建
(具体是什么数据结构我也不清楚。。。有兴趣的同志可以去看看源代码。。。)
parent是什么呢?欢迎补充= =
关于
ll = (LinearLayout) LayoutInflater.from(this.getContext()).inflate(R.layout.pictureandtext_listcell, null);
引用一句话:它的作用类似于findViewById(),创建一个组件实例。不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化;而findViewById()是找xml布局文件下的具体widget控件(如Button、TextView等)。
这里采用了第二种,从创建ListView的Content中获取。
public class PicAndTxtListViewAdapter extends BaseAdapter {
private Context context;
public PicAndTxtListViewAdapter(Context context) {
this.context=context;
}
public Context getContext() {
return context;
}
public void setContext(Context context) {
this.context = context;
}
private PicAndTxtCell[] data = {
new PicAndTxtCell("XXX", "xxxx-x", R.drawable.image_2),
new PicAndTxtCell("XXX", "xxxx-x", R.drawable.image_2),
new PicAndTxtCell("XXX", "xxxx-x", R.drawable.image_1)
};
@Override
public View getView(int position, View convertView, ViewGroup parent) {
PicAndTxtCell data = getItem(position);
LinearLayout ll = null;
if(convertView!=null)
{
ll = (LinearLayout)convertView;
}
else
{
ll = (LinearLayout) LayoutInflater.from(this.getContext()).inflate(R.layout.pictureandtext_listcell, null);
}
ImageView im = (ImageView) ll.findViewById(R.id.icon);
TextView name = (TextView) ll.findViewById(R.id.name);
TextView dec = (TextView) ll.findViewById(R.id.description);
im.setImageResource(data.iconId);
name.setText(data.name);
dec.setText(data.date);
return ll;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public PicAndTxtCell getItem(int position) {
return data[position];
}
@Override
public int getCount() {
return data.length;
}
}