zoukankan      html  css  js  c++  java
  • Android ListView ArrayAdapter 的简单使用

    前面写了3篇关于android的文章,其中的演示程序都写在了一个工程中,当时为了方便测试就在启动页MainActivity中放了3个按钮,点击不同的按钮进入不同的示例程序页面,MainActivity的界面如下截图:

    按照上面的设计,每写一个演示程序就需要在MainActivity中新增一个按钮并为其写点击事件,感觉这样有点麻烦,于是想改进一下,顺便用一下ListView和ArrayAdapter。经过改进后的启动页如下图:

    新建了一个MainActivity2,用一个ListView来展现演示程序列表,点击相应列表项就跳转到相应的演示页面,功能和之前的MainActivity一样,但之后就不需要不断添加按钮及其点击事件了,只需要为每个演示页面添加一行代码:catalogs.add(new Catalog("演示的名称", 要跳转到的Activity.class)),这样就简洁多了,具体代码如下。

    MainActivity2布局文件如下:

    <?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="vertical" >
    
        <ListView
            android:id="@+id/lvCatalog"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" >
        </ListView>
    
    </LinearLayout>

    MainActivity2 Java代码如下:

    package chengyujia.demo.aty;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.AdapterView.OnItemClickListener;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;
    import chengyujia.demo.R;
    import chengyujia.demo.model.Catalog;
    
    public class MainActivity2 extends BaseActivity {
    
        private ListView lvCatalog;
        private List<Catalog> catalogs;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main2);
            lvCatalog = (ListView) findViewById(R.id.lvCatalog);
            init();
        }
    
        private void init() {
            catalogs = new ArrayList<Catalog>();
            // 为主页目录添加条目,以后每多写一个例子,在这里添加一个条目就可以了。
            // 不像以前MainActivity中每多写一个例子,需要添加一个按钮,还要写相应的点击事件。
            catalogs.add(new Catalog("屏幕方向", OrientationActivity.class));
            catalogs.add(new Catalog("打电话", CallActivity.class));
            catalogs.add(new Catalog("版本信息", VersionActivity.class));
    
            // 这里ListView的适配器选用ArrayAdapter,ListView中每一项的布局选用系统的simple_list_item_1。
            ArrayAdapter<Catalog> adapter = new ArrayAdapter<Catalog>(this, android.R.layout.simple_list_item_1, catalogs);
            lvCatalog.setAdapter(adapter);
    
            // 通过一个实现OnItemClickListener接口的匿名类的onItemClick方法来处理ListView中每一项的点击事件。
            lvCatalog.setOnItemClickListener(new OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    startActivity(new Intent(MainActivity2.this, catalogs.get(position).cls));
                }
            });
        }
    }

    在这里还使用了一个自定义的Model类Catalog,用来表示列表中的每一项绑定的数据,其代码如下:

    package chengyujia.demo.model;
    
    import android.app.Activity;
    
    //主页目录列表项
    public class Catalog {
    
        // 条目名称
        public String name;
        // 点击条目要跳转到的目标Activity的类型
        public Class<? extends Activity> cls;
    
        // 写个带参数的构造方法,方便赋值使用。
        public Catalog(String name, Class<? extends Activity> cls) {
            this.name = name;
            this.cls = cls;
        }
    
        // ListView使用ArrayAdapter<T>时每个列表项显示的内容就是T的toString方法返回的值,
        // 如果这里不重写则会调用父类Object的toString方法。
        @Override
        public String toString() {
            return name;
        }
    }

    Catalog类中注意的是一定要重写toString方法,不然的话ListView的每一项显示的是“对象的类名+@+hashCode”的组合字符串。

  • 相关阅读:
    C# 反射修改私有静态成员变量
    symfony2 controller
    symfony2 路由工作原理及配置
    symfony2 安装并创建第一个页面
    git操作命令
    Node异步I/O、事件驱动与高性能服务器
    nodejs get/request
    nodejs events模块
    nodejs 小爬虫
    nodejs API
  • 原文地址:https://www.cnblogs.com/chengyujia/p/5031323.html
Copyright © 2011-2022 走看看