【转】Android笔记-如何创建列表视图2

上一篇讲到用ArrayAdapter和ListView合作实现列表视图,不过ArrayAdapter的项只是简单的字符串,这一次要现实自定义的类。

    我想做这样一件事情:程序的主界面是一个列表视图,里面的每一项代表一个Activity,当我点击这一项时,就自动运行这个Activty。
    我们修改前面的例子来完成功能:

1.  写一个自定义类,作为ArrayAdapter的项:
MainForm.java
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->      //  运行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;
    }
    该类的几个成员:
    mDesc Activity的描述,从toString()返回,显示在列表视图里。
    mClass 代表要运行的Activity,等下调用startActivity时要用到。
    mStrId 资源ID,允许描述定义在资源文件里,然后通过Context.getString(resId)取回字符串。
    mContext 环境类

2.  修改MainForm的onCreate函数:
MainForm.java
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->     @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);
    } 
    主要是修改ArrayAdapter的类型参数,变成DemoActivityInfo,这一变mDemoList的类型也要跟着变了:
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->      private  DemoActivityInfo [] mDemoList  =  
    {
        
new  DemoActivityInfo( this , CheckListView. class , R.string.clv_title)
    }; 
    我们以后有新的Activity只需要往后面增加就行了。

3.  修改项点击事件,改变运行一个Activity:
代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->      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));
        }
    };

 

4.  我们完成了MainForm的修改,但还需要增加一些东西,比如:
    new DemoActivityInfo(this, CheckListView.class, R.string.clv_title)
    里面的R.string.clv_title,这是一个字符串资源,增加起来很简单,在res/values/strings.xml直接增加就可以了:
strings.xml
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->      <? 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 >

 

    我们还得增加CheckListView这个Activity,这稍微有点烦琐,但并不麻烦:
    *.  先增加一个layout文件,前面已经讲过如何增加,不再描述,只给出文件内容:
checklistview.xml
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->         <? 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 >

 

    *.  新建一个类:
        *.  右键src选择New/Class
        *.  在弹出来的对话框中输入下面的信息:
            Package处输入包名,我这里是: colin.demo
            Name处输入类名:CheckListView
            SuperClass处输入父类,点旁边的Browser可以快速搜索父类:android.app.Activity
            最后点击Finish完成。
        *.  完成后就多了一个CheckListView类,我们覆盖它的onCreate方法,把刚才增加的Layout设进来:
CheckListView.java
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->              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);
                }
            }

         

        *.  最后一步,把这个Activity类加到AndroidManifest.xml里面
            由于该类是内部使用,因此不需要Intent-filter,所以可以写得比较简单:
            在manifest/application元素下面,增加一个Activity子元素,
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->             < activity  android:name =".CheckListView"
                     android:label
="@string/clv_title" >
           
</ activity >

 

5.  经过上面的努力,应该可以运行看一下效果了:
    
    

    上图看到CheckListView只是一个空白的界面,从它的名字看来,是要做一个带有复选框的列表视图了,这是下一篇的主题,敬请期待!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值