上一篇讲到用ArrayAdapter和ListView合作实现列表视图,不过ArrayAdapter的项只是简单的字符串,这一次要现实自定义的类。
我想做这样一件事情:程序的主界面是一个列表视图,里面的每一项代表一个Activity,当我点击这一项时,就自动运行这个Activty。
我们修改前面的例子来完成功能:
1. 写一个自定义类,作为ArrayAdapter的项:
MainForm.java
//
运行Activity的必要信息
class DemoActivityInfo
{
public DemoActivityInfo(Context context, Class <?> cls, int strId)
{
mStrId = strId;
mClass = cls;
mContext = context;
}
public DemoActivityInfo(Context context, Class <?> cls, String desc)
{
mDesc = desc;
mClass = cls;
mContext = context;
}
@Override
public String toString()
{
// 这个会在列表视图里面显示
if (mDesc == null )
mDesc = mContext.getString(mStrId);
return mDesc;
}
public String mDesc;
public Class <?> mClass;
private int mStrId;
private Context mContext;
}
class DemoActivityInfo
{
public DemoActivityInfo(Context context, Class <?> cls, int strId)
{
mStrId = strId;
mClass = cls;
mContext = context;
}
public DemoActivityInfo(Context context, Class <?> cls, String desc)
{
mDesc = desc;
mClass = cls;
mContext = context;
}
@Override
public String toString()
{
// 这个会在列表视图里面显示
if (mDesc == null )
mDesc = mContext.getString(mStrId);
return mDesc;
}
public String mDesc;
public Class <?> mClass;
private int mStrId;
private Context mContext;
}
该类的几个成员:
mDesc Activity的描述,从toString()返回,显示在列表视图里。
mClass 代表要运行的Activity,等下调用startActivity时要用到。
mStrId 资源ID,允许描述定义在资源文件里,然后通过Context.getString(resId)取回字符串。
mContext 环境类
2. 修改MainForm的onCreate函数:
MainForm.java
@Override
public void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.main);
// 取得ListView
mListView = (ListView)findViewById(R.id.listview_main);
// 创建一个ArrayAdapter
ArrayAdapter < DemoActivityInfo > uiDemoList =
new ArrayAdapter < DemoActivityInfo > ( this , R.layout.textview_item, mDemoList);
mListView.setAdapter(uiDemoList);
// 使ListView支持过滤搜索
mListView.setTextFilterEnabled( true );
// 设置事件
mListView.setOnItemClickListener(mItemClickListenter);
}
public void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.main);
// 取得ListView
mListView = (ListView)findViewById(R.id.listview_main);
// 创建一个ArrayAdapter
ArrayAdapter < DemoActivityInfo > uiDemoList =
new ArrayAdapter < DemoActivityInfo > ( this , R.layout.textview_item, mDemoList);
mListView.setAdapter(uiDemoList);
// 使ListView支持过滤搜索
mListView.setTextFilterEnabled( true );
// 设置事件
mListView.setOnItemClickListener(mItemClickListenter);
}
主要是修改ArrayAdapter的类型参数,变成DemoActivityInfo,这一变mDemoList的类型也要跟着变了:
private
DemoActivityInfo [] mDemoList
=
{
new DemoActivityInfo( this , CheckListView. class , R.string.clv_title)
};
{
new DemoActivityInfo( this , CheckListView. class , R.string.clv_title)
};
我们以后有新的Activity只需要往后面增加就行了。
3. 修改项点击事件,改变运行一个Activity:
代码
private
OnItemClickListener mItemClickListenter
=
new
OnItemClickListener()
{
@Override
public void onItemClick(AdapterView <?> parent, View view, int position, long id)
{
// 运行Activity
startActivity( new Intent(MainFrom. this ,
MainFrom. this .mDemoList[position].mClass));
}
};
{
@Override
public void onItemClick(AdapterView <?> parent, View view, int position, long id)
{
// 运行Activity
startActivity( new Intent(MainFrom. this ,
MainFrom. this .mDemoList[position].mClass));
}
};
4. 我们完成了MainForm的修改,但还需要增加一些东西,比如:
new DemoActivityInfo(this, CheckListView.class, R.string.clv_title)
里面的R.string.clv_title,这是一个字符串资源,增加起来很简单,在res/values/strings.xml直接增加就可以了:
strings.xml
<?
xml version="1.0" encoding="utf-8"
?>
< resources >
< string name ="hello" > Hello World, MainFrom! </ string >
< string name ="app_name" > 界面测试工程 </ string >
< string name ="clv_title" > 带有复选框的列表视图 </ string >
</ resources >
< resources >
< string name ="hello" > Hello World, MainFrom! </ string >
< string name ="app_name" > 界面测试工程 </ string >
< string name ="clv_title" > 带有复选框的列表视图 </ string >
</ resources >
我们还得增加CheckListView这个Activity,这稍微有点烦琐,但并不麻烦:
*. 先增加一个layout文件,前面已经讲过如何增加,不再描述,只给出文件内容:
checklistview.xml
<?
xml version="1.0" encoding="utf-8"
?>
< ListView
xmlns:android ="http://schemas.android.com/apk/res/android"
android:layout_width ="fill_parent"
android:layout_height ="fill_parent" >
</ ListView >
< ListView
xmlns:android ="http://schemas.android.com/apk/res/android"
android:layout_width ="fill_parent"
android:layout_height ="fill_parent" >
</ ListView >
*. 新建一个类:
*. 右键src选择New/Class
*. 在弹出来的对话框中输入下面的信息:
Package处输入包名,我这里是: colin.demo
Name处输入类名:CheckListView
SuperClass处输入父类,点旁边的Browser可以快速搜索父类:android.app.Activity
最后点击Finish完成。
*. 完成后就多了一个CheckListView类,我们覆盖它的onCreate方法,把刚才增加的Layout设进来:
CheckListView.java
package
colin.demo;
import android.app.Activity;
import android.os.Bundle;
public class CheckListView extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super .onCreate(savedInstanceState);
setContentView(R.layout.checklistview);
}
}
import android.app.Activity;
import android.os.Bundle;
public class CheckListView extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super .onCreate(savedInstanceState);
setContentView(R.layout.checklistview);
}
}
*. 最后一步,把这个Activity类加到AndroidManifest.xml里面
由于该类是内部使用,因此不需要Intent-filter,所以可以写得比较简单:
在manifest/application元素下面,增加一个Activity子元素,
<
activity
android:name
=".CheckListView"
android:label ="@string/clv_title" >
</ activity >
android:label ="@string/clv_title" >
</ activity >
5. 经过上面的努力,应该可以运行看一下效果了:
上图看到CheckListView只是一个空白的界面,从它的名字看来,是要做一个带有复选框的列表视图了,这是下一篇的主题,敬请期待!