Android(java)学习笔记133:ListViewProject案例02

这个案例可能稍微复杂一点,我会讲述详细一点:

1.首先是AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.himi"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="15"
        android:targetSdkVersion="17" />

    <application
        android:icon="@drawable/icon"
        android:label="@string/app_name" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

2.布局文件main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/iv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/bigtv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="20sp" />

        <TextView
            android:id="@+id/smalltv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="10sp" />
    </LinearLayout>

    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:focusable="false"
        android:text="button" />

    <CheckBox
        android:id="@+id/cb"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:focusable="false" />

</LinearLayout>

3.这里是MySimpleAdapter.java:

/**
 *
 */
package com.himi;
import java.util.List;
import java.util.Map;
import android.app.AlertDialog;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.CompoundButton.OnCheckedChangeListener;

/**
 * @author Himi
 *
 */
public class MySimpleAdapter extends BaseAdapter {
    //声明一个LayoutInflater对象(其作用是用来实例化布局)
    private LayoutInflater mInflater;
    private List<Map<String, Object>> list;//声明List容器对象
    private int layoutID; //声明布局ID
    private String flag[];//声明ListView项中所有组件映射索引
    private int ItemIDs[];//声明ListView项中所有组件ID数组
    public MySimpleAdapter(Context context, List<Map<String, Object>> list,
            int layoutID, String flag[], int ItemIDs[]) {
        //利用构造来实例化成员变量对象
        this.mInflater = LayoutInflater.from(context);
        this.list = list;
        this.layoutID = layoutID;
        this.flag = flag;
        this.ItemIDs = ItemIDs;
    }
    @Override
    public int getCount() {//放回当前的adapter当中共包含多少个item
        return list.size();//返回ListView项的长度
    }

    @Override
    public Object getItem(int arg0) {//根据位置得到相应的Item对象
        return 0;
    }

    @Override
    public long getItemId(int arg0) {//根据位置得到相应的item对象的Id
        return 0;
    }    //listView通过调用getView方法得到相应的view对象,并显示在相应的activity之中
    //实例化布局与组件以及设置组件数据
    //getView(int position, View convertView, ViewGroup parent)
    //第一个参数:绘制的行数
    //第二个参数:绘制的视图这里指的是ListView中每一项的布局
    //第三个参数:view的合集,这里不需要
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //将布局通过mInflater对象实例化为一个view,Inflater.inflate方法的主要作用就是将xml转换成一个View对象,用于动态的创建布局。
        convertView = mInflater.inflate(layoutID, null);
        for (int i = 0; i < flag.length; i++) {//遍历每一项的所有组件
            //每个组件都做匹配判断,得到组件的正确类型
            if (convertView.findViewById(ItemIDs[i]) instanceof ImageView) {
                //findViewById()函数作用是实例化布局中的组件
                //当组件为ImageView类型,则为其实例化一个ImageView对象
                ImageView iv = (ImageView) convertView.findViewById(ItemIDs[i]);
                //为其组件设置数据,list.get()获得列表指定位置的元素,这个元素返回为list,然后再使用get()方法获取ID,R.id……
                iv.setBackgroundResource((Integer) list.get(position).get(
                        flag[i]));
            } else if (convertView.findViewById(ItemIDs[i]) instanceof TextView) {
                //当组件为TextView类型,则为其实例化一个TextView对象
                TextView tv = (TextView) convertView.findViewById(ItemIDs[i]);
                //为其组件设置数据
                tv.setText((String) list.get(position).get(flag[i]));
            }
        }
        //为按钮设置监听
        ((Button)convertView.findViewById(R.id.btn)).setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        //这里弹出一个对话框,后文有详细讲述
                        new AlertDialog.Builder(MainActivity.ma)
                        .setTitle("自定义SimpleAdapter")
                        .setMessage("按钮成功触发监听事件!")
                        .show();
                    }
                });
        //为复选框设置监听
        ((CheckBox)convertView.findViewById(R.id.cb)).
        setOnCheckedChangeListener(new OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                //这里弹出一个对话框,后文有详细讲述
                new AlertDialog.Builder(MainActivity.ma)
                .setTitle("自定义SimpleAdapter")
                .setMessage("CheckBox成功触发状态改变监听事件!")
                .show();
            }
        });
        return convertView;
    }
}

4.MainAcitivity.java:

package com.himi;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.SimpleAdapter;

public class MainActivity extends Activity {
    private SimpleAdapter adapter;// 声明适配器对象
    private ListView listView; // 声明列表视图对象
    private List<Map<String, Object>> list;// 声明列表容器
    public static MainActivity ma;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ma = this;
        // 实例化列表容器,list是接口,ArrayList是接口List实现类,多态
        list = new ArrayList<Map<String, Object>>();
        listView = new ListView(this);// 实例化列表视图
        // 实例一个列表数据容器,Map是接口,HashMap是接口Map的实现类,多态
        Map<String, Object> map = new HashMap<String, Object>();
        // 往列表容器中添加数据
        map.put("item1_imageivew", R.drawable.icon);
        map.put("item1_bigtv", "BIGTV");
        map.put("item1_smalltv", "SMALLTV");
        // 将列表数据添加到列表容器中
        list.add(map);
        // 使用Android 提供的SimpleAdapter适配器,无法实现组件监听;
        // adapter = new SimpleAdapter(this, list, R.layout.main,
        // new String[] {"item1_imageivew", "item1_bigtv", "item1_smalltv" },
        // new int[] {R.id.iv, R.id.bigtv, R.id.smalltv });
        // --使用自定义适配器,可监听其ListView中每一项的事件监听
        MySimpleAdapter adapter = new MySimpleAdapter(this, list,
                R.layout.main, new String[] { "item1_imageivew", "item1_bigtv",
                        "item1_smalltv" }, new int[] { R.id.iv, R.id.bigtv,
                        R.id.smalltv });
        // 为列表视图设置适配器(将数据映射到列表视图中)
        listView.setAdapter(adapter);
        // //显示列表视图
        this.setContentView(listView);
    }
}
时间: 2024-08-01 08:55:09

Android(java)学习笔记133:ListViewProject案例02的相关文章

java/android 设计模式学习笔记(13)---享元模式

这篇我们来介绍一下享元模式(Flyweight Pattern),Flyweight 代表轻量级的意思,享元模式是对象池的一种实现.享元模式用来尽可能减少内存使用量,它适合用于可能存在大量重复对象的场景,缓存可共享的对象,来达到对象共享和避免创建过多对象的效果,这样一来就可以提升性能,避免内存移除和频繁 GC 等. 享元模式的一个经典使用案例是文本系统中图形显示所用的数据结构,一个文本系统能够显示的字符种类就是那么几十上百个,那么就定义这么些基础字符对象,存储每个字符的显示外形和其他的格式化数据

java/android 设计模式学习笔记(12)---组合模式

这篇我们来介绍一下组合模式(Composite Pattern),它也称为部分整体模式(Part-Whole Pattern),结构型模式之一.组合模式比较简单,它将一组相似的对象看作一个对象处理,并根据一个树状结构来组合对象,然后提供一个统一的方法去访问相应的对象,以此忽略掉对象与对象集合之间的差别.这个最典型的例子就是数据结构中的树了,如果一个节点有子节点,那么它就是枝干节点,如果没有子节点,那么它就是叶子节点,那么怎么把枝干节点和叶子节点统一当作一种对象处理呢?这就需要用到组合模式了. 转

java/android 设计模式学习笔记(14)---外观模式

这篇博客来介绍外观模式(Facade Pattern),外观模式也称为门面模式,它在开发过程中运用频率非常高,尤其是第三方 SDK 基本很大概率都会使用外观模式.通过一个外观类使得整个子系统只有一个统一的高层的接口,这样能够降低用户的使用成本,也对用户屏蔽了很多实现细节.当然,在我们的开发过程中,外观模式也是我们封装 API 的常用手段,例如网络模块.ImageLoader 模块等.其实我们在开发过程中可能已经使用过很多次外观模式,只是没有从理论层面去了解它. 转载请注明出处:http://bl

java/android 设计模式学习笔记(10)---建造者模式

这篇博客我们来介绍一下建造者模式(Builder Pattern),建造者模式又被称为生成器模式,是创造性模式之一,与工厂方法模式和抽象工厂模式不同,后两者的目的是为了实现多态性,而 Builder 模式的目的则是为了将对象的构建与展示分离.Builder 模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程.一个复杂的对象有大量的组成部分,比如汽车它有车轮.方向盘.发动机.以及各种各样的小零件,要将这些部件装配成一辆汽车,这个装配过

java/android 设计模式学习笔记(一)---单例模式

前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使用的时候也会有一些坑. PS:对技术感兴趣的同鞋加群544645972一起交流 设计模式总目录 java/android 设计模式学习笔记目录 特点 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式的使用很广泛,比如:线程池(threadpool).缓存(cache).对

java/android 设计模式学习笔记(7)---装饰者模式

这篇将会介绍装饰者模式(Decorator Pattern),装饰者模式也称为包装模式(Wrapper Pattern),结构型模式之一,其使用一种对客户端透明的方式来动态的扩展对象的功能,同时它也是继承关系的一种替代方案之一,但比继承更加灵活.在现实生活中也可以看到很多装饰者模式的例子,或者可以大胆的说装饰者模式无处不在,就拿一件东西来说,可以给它披上无数层不一样的外壳,但是这件东西还是这件东西,外壳不过是用来扩展这个东西的功能而已,这就是装饰者模式,装饰者的这个角色也许各不相同但是被装饰的对

java/android 设计模式学习笔记(9)---代理模式

这篇博客我们来介绍一下代理模式(Proxy Pattern),代理模式也成为委托模式,是一个非常重要的设计模式,不少设计模式也都会有代理模式的影子.代理在我们日常生活中也很常见,比如上网时连接的代理服务器地址,更比如我们平时租房子,将找房子的过程代理给中介等等,都是代理模式在日常生活中的使用例子. 代理模式中的代理对象能够连接任何事物:一个网络连接,一个占用很多内存的大对象,一个文件,或者是一些复制起来代价很高甚至根本不可能复制的一些资源.总之,代理是一个由客户端调用去访问幕后真正服务的包装对象

java/android 设计模式学习笔记(6)---适配器模式

这篇来介绍一下适配器模式(Adapter Pattern),适配器模式在开发中使用的频率也是很高的,像 ListView 和 RecyclerView 的 Adapter 等都是使用的适配器模式.在我们的实际生活中也有很多类似于适配器的例子,比如香港的插座和大陆的插座就是两种格式的,为了能够成功适配,一般会在中间加上一个电源适配器,形如: 这样就能够将原来不符合的现有系统和目标系统通过适配器成功连接. 说到底,适配器模式是将原来不兼容的两个类融合在一起,它有点类似于粘合剂,将不同的东西通过一种转

java/android 设计模式学习笔记(16)---命令模式

这篇博客我们来介绍一下命令模式(Command Pattern),它是行为型设计模式之一.命令模式相对于其他的设计模式更为灵活多变,我们接触比较多的命令模式个例无非就是程序菜单命令,如在操作系统中,我们点击关机命令,系统就会执行一系列的操作,如先是暂停处理事件,保存系统的一些配置,然后结束程序进程,最后调用内核命令关闭计算机等,对于这一系列的命令,用户不用去管,用户只需点击系统的关机按钮即可完成如上一系列的命令.而我们的命令模式其实也与之相同,将一系列的方法调用封装,用户只需调用一个方法执行,那

java/android 设计模式学习笔记(3)---工厂方法模式

这篇来介绍一下工厂方法模式(Factory Method Pattern),在实际开发过程中我们都习惯于直接使用 new 关键字用来创建一个对象,可是有时候对象的创造需要一系列的步骤:你可能需要计算或取得对象的初始设置:选择生成哪个子对象实例:或在生成你需要的对象之前必须先生成一些辅助功能的对象,这个时候就需要了解该对象创建的细节,也就是说使用的地方与该对象的实现耦合在了一起,不利于扩展,为了解决这个问题就需要用到我们的工厂方法模式,它适合那些创建复杂的对象的场景,工厂方法模式也是一个使用频率很