因为项目的需要,需要使用ListView加载自定义的布局,因此自己定义Adapter继承BaseAdapter,在Adapter之中做了View的响应处理操作,并且能够将Adapter之中相关的View的概况通过Handler发送给Activity实现消息通信。
整个实现的预览图如图所示:ps这里是模拟车辆状态的一些说明
主要实现的一些功能:
1/ 统计开启功能个数,使用Handler
2/ 一键开启/关闭所有功能
3/ 每一个View实现响应功能:view左侧区域弹出关于此功能介绍,view右侧区域实现开启/关闭该功能
以下是代码说明:
DriveinfoAdapter:继承自BaseAdapter
构造函数:
public DriveinfoAdapter(Context mContext, ArrayList<String> mList, Handler mhandler)
mContext::实现Activity对象对应Context的一系列引用
mList:实现每个View加载的文字说明
mhandler:建立Handler-Message之间的信息通信
关键说明:
1/ SparseBooleanArray:用来记录每个View中开启/关闭状态,亦可以使用HashMap<Integer,Boolean>,不过推荐使用SparseBooleanArray,比HashMap要高效,至于怎么高效,后面的文章会有所说明
// 在构造函数中,全部将其状态置为false,进行初始化
for (int i = 0; i < list.size(); i++) {
// isSelected.put(i, false);
sba.put(i, false);
}
public static SparseBooleanArray getSba() {
return sba;
}
public static void setSba(SparseBooleanArray sba) {
DriveinfoAdapter.sba = sba;
}
2/ ViewHolder:创建该类主要是为了优化ListView,使得View刷新过程中能够充分加载缓存的View,进而使得View的加载刷新效果提升
public class ViewHolder {
/**行车功能的各项图标*/
private ImageView drive_func_image;
/**行车功能的名称*/
private TextView function_menu;
/**左侧布局,设置监听事件实现弹出对话框对行车功能进行解释说明*/
private LinearLayout left_note;
/**右侧布局,点击监听事件实现开关的开启关闭*/
private LinearLayout right_toggle;
/**右侧开关,显示当前功能项的开启或者关闭状态*/
private ToggleButton right_turn;
/**文字显示功能项的开启或者关闭:“已开启”或者“已关闭”*/
private TextView function_state;
}
3/ Handler:先进行Message的参数配置,message.arg1为统计开启功能个数,其值为funcOpenCount()返回值,message.obj为开启/关闭每个功能发送的字符串
public void Message(String send) {
Message message = new Message();
message.what = 1;
message.arg1 = funcOpenCount();
message.obj = send;
handler.sendMessage(message);
}
/**
* 记录开启的功能个数
* @return
*/
public int funcOpenCount() {
int count = 0;
// 将Map中的数据,全部将其状态置为false
for (int i = 0; i < list.size(); i++) {
// if(isSelected.get(i))
// {
// count++;
// }
if (sba.get(i)) {
count++;
}
}
return count;
}
CmDriveinfoActivity:继承Activity类,加载主体布局文件
关键部分
Handler消息接受与处理操作
//实例化Handler对象,实现adapter和activity的消息传递。HandleMessage对msg进行判断解析,得到信息
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 1:
//设置已开启功能的个数
note.setText("已开启 "+msg.arg1+ "个功能");
//获取待获取的指令信息
String ss = (String) msg.obj;
if (D)
Log.d(TAG + ":handler ->ss", ss);
break;
default:
break;
}
}
};
主要布局文件说明:
cm_driveinfo.xml:Activity加载的布局文件
cm_driveinfo_dialog:ListView点击左侧View区域弹出关于该功能介绍的布局文件
cm_driveinfo_listview:ListView中每一项View的布局文件
cm_driveinfo_menu_dialog:全部开启/禁止,右上角menu按钮触发
详细代码参考~: