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

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);
}
}

 运行时候程序效果图:

当我们点击Button之后,会出现以下效果:

当我们点击checkbox复选框,如下效果:

Android(java)学习笔记75:ListViewProject案例(ListView + BaseAdapter + CheckBox)的更多相关文章

  1. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  2. Java学习笔记4

    Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...

  3. 0028 Java学习笔记-面向对象-Lambda表达式

    匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...

  4. Android动画学习笔记-Android Animation

    Android动画学习笔记-Android Animation   3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中 ...

  5. Java学习笔记:语言基础

    Java学习笔记:语言基础 2014-1-31   最近开始学习Java,目的倒不在于想深入的掌握Java开发,而是想了解Java的基本语法,可以阅读Java源代码,从而拓展一些知识面.同时为学习An ...

  6. Android 数字签名学习笔记

    Android 数字签名学习笔记 在Android系统中,所有安装到系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程序之间建立信任关系,如果一个permission的pro ...

  7. 【Java学习笔记之二十六】深入理解Java匿名内部类

    在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意 ...

  8. java学习笔记之日期日历类

    java学习笔记之日期日历 Date日期类概述: 表示特定的瞬间,精确到毫秒 Date类的构造方法: 1.空参数构造方法 Date date = new Date(); 获取到当前操作系统中的时间和日 ...

  9. java学习笔记11--集合总结

    java学习笔记系列: java学习笔记10--泛型总结 java学习笔记9--内部类总结 java学习笔记8--接口总结 java学习笔记7--抽象类与抽象方法 java学习笔记6--类的继承.Ob ...

  10. 20145316许心远《Java学习笔记(第8版)》课程总结

    20145316许心远<Java学习笔记(第8版)>课程总结 每周读书笔记链接汇总 ▪ 第一周读书笔记 ▪ 第二周读书笔记 ▪ 第三周读书笔记 ▪ 第四周读书笔记 ▪ 第五周读书笔记 ▪ ...

随机推荐

  1. 使用js页面添加或删除标签

    // 添加var container = document.getElementById('divAudio');container.appendChild(audio); // 删除var cont ...

  2. Codevs 1080 线段树练习(CDQ分治)

    1080 线段树练习  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 一行N个方格,开始每个格子里都有 ...

  3. 关于after和before

    你可曾'百度一下'? 在以前的很多时候,当我断网了,或者网络出了莫名其妙的问题时,我总是第一个输入它的网址.它不仅仅是一个搜索引擎.它还是我检验网络的唯一标准(手动滑稽). CSS中的after和be ...

  4. js 设置 cookie

    function setCookie(name,value){ var Days = 30; var exp = new Date(); exp.setTime(exp.getTime() + Day ...

  5. mybatis深入理解(一)之 # 与 $ 区别以及 sql 预编译

    mybatis 中使用 sqlMap 进行 sql 查询时,经常需要动态传递参数,例如我们需要根据用户的姓名来筛选用户时,sql 如下: select * from user where name = ...

  6. SPOJ 3267: DQUERY 树状数组,离线算法

    给出q个询问,询问一段区间里面的不同元素的个数有多少个. 离线做,用树状数组. 设树状数组的意义是:1--pos这个段区间的不用元素的种类数.怎么做?就是add(pos,1);在这个位置中+1,就是说 ...

  7. man时括号里的数字是啥意思

    https://www.cnblogs.com/istarstar/p/7851233.html 具体含义可以man man来查看(自己查自己). MANUAL SECTIONS The standa ...

  8. log(A^B) = BlogA

    令 x = logA, y = logB, z=log(AB) .2x = A, 2y = B, 2z = AB, 则有 2z = AB = (2x)^(2y) = 2x(2^y) ,有z = x*2 ...

  9. Maven的学习资料收集--(六) 构建Hibernate项目

    前面我们使用Maven构建了Struts2项目,这里我们来试一下Hibernate项目: 这里的例子,大体框架应该是正确的,但是,对于Maven的很多约定都没有掌握,估计包的命名都不是非常好,等以后, ...

  10. 判断两个IP地址是不是属于同一子网的方法

    一个IP地址有三种写法: 第一种,单个IP,如192.168.55.28 第二种,IP/子网掩码,如192.168.55.28/255.255.255.0 第三种,IP/子网掩码长度,如192.168 ...