ExpandableListView组件中CheckBox全选的使用(使用观察者模式)
2016-04-06 11:19
453 查看
ExpandableListView组件类似于手机QQ的好友分组组件,点击分组可展开显示分组下的子数据,很多时候我们会利用ExpandableListView实现子数据选中以及分组钟全部数据选中的功能,本篇博客就是介绍该功能的实现,以及观察者模式的使用。
首先看下实现截图:
![](https://img-blog.csdn.net/20160406110835451?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
然后贴下Activity代码:
布局文件xml代码:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="5dp"
android:orientation="vertical"
tools:context="com.example.observer.ObserverActivity" >
<TextView
android:id="@+id/selectedview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="16sp"/>
<ExpandableListView
android:id="@+id/expandablelistview"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_marginTop="10dp"
android:groupIndicator="@null"/>
</LinearLayout>
最后是两个实体类的代码(两个实体类本身即属于观察者,又同时属于被观察者):
分组实体需要继承Observable类和实现Observer接口
package com.example.observer;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
import android.util.Log;
public class Group extends Observable implements Observer{
private String groupName;
private List<Child> childs;
private boolean isSelected;
public String getGroupName() {
return groupName;
}
public void setGroupName(String groupName) {
this.groupName = groupName;
}
public List<Child> getChilds() {
return childs;
}
public void setChilds(List<Child> childs) {
this.childs = childs;
}
public boolean isSelected() {
return isSelected;
}
public void setSelected(boolean isSelected) {
this.isSelected = isSelected;
}
public void changeChecked(){
isSelected=!isSelected;
setChanged();
notifyObservers(isSelected);
}
@Override
public void update(Observable observable, Object data) {
Log.i("YHW", "group update");
boolean flag=true;
for (Child child: childs) {
if(!child.isSelected()){
flag=false;
}
}
isSelected=flag;
}
}
子数据实体需要继承Observable类和实现Observer接口
<span style="color:#333333;">package com.example.observer;
import java.util.Observable;
import java.util.Observer;
import android.util.Log;
public class Child extends Observable implements Observer{
private String childName;
private boolean isSelected;
public String getChildName() {
return childName;
}
public void setChildName(String childName) {
this.childName = childName;
}
public boolean isSelected() {
return isSelected;
}
public void setSelected(boolean isSelected) {
this.isSelected = isSelected;
}
public void changeChecked(){
isSelected=!isSelected;
setChanged();
notifyObservers();
}
@Override
public void update(Observable observable,
968a
Object data) {
Log.i("YHW", "child update");
if(data instanceof Boolean){
isSelected=(Boolean) data;
}
}
}</span><span style="color:#ff0000;">
</span>
总结:
总体实现比较简单,就不做过多阐述了,主要就是通过观察者模式,实现分组数据和子数据之间互相监听选中与否
首先看下实现截图:
然后贴下Activity代码:
package com.example.observer; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.ExpandableListView; import android.widget.ExpandableListView.OnChildClickListener; import android.widget.TextView; import com.example.testdemo.R; /** * 观察者模式实现 ExpandableListView 的全选功能 * @author yhw * */ public class ObserverActivity extends Activity implements OnChildClickListener{ private ExpandableListView expandableListView; private ExpandAdapter expandAdapter; private List<Group>groups; private TextView textView; //显示选中对象的view private StringBuffer buffer; private List<Object> selecteds=new ArrayList<Object>(); //存放选中对象的集合 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_observer); expandableListView=(ExpandableListView) findViewById(R.id.expandablelistview); textView=(TextView)findViewById(R.id.selectedview); expandableListView.setOnChildClickListener(this); buffer=new StringBuffer(); showData(); } private final static String provinces[]={"陕西省","内蒙古","山西省","辽宁省"}; private final static String citys[][]={{"西安市","咸阳市","汉中市","榆林市","延安市"} ,{"呼和浩特","锡林郭勒","巴彦淖尔","鄂尔多斯"} ,{"太原市","吕梁市","大同市"} ,{"沈阳市","大连市"}}; private void showData(){ groups=new ArrayList<Group>(); for (int i = 0; i < provinces.length; i++) { Group group=new Group(); group.setGroupName(provinces[i]); group.setSelected(false); List<Child> childs=new ArrayList<Child>(); for (int j = 0; j < citys[i].length; j++) { Child child=new Child(); child.setSelected(false); child.setChildName(citys[i][j]); childs.add(child); child.addObserver(group); group.addObserver(child); } group.setChilds(childs); groups.add(group); } if(expandAdapter==null){ expandAdapter=new ExpandAdapter(this, groups); expandableListView.setAdapter(expandAdapter); }else{ expandAdapter.notifyDataSetChanged(); } } @Override public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { Child child=groups.get(groupPosition).getChilds().get(childPosition); child.changeChecked(); showSelected(); expandAdapter.notifyDataSetChanged(); return false; } /**显示选中的数据*/ public void showSelected(){ //清除 selecteds.clear(); buffer.delete(0, buffer.length()); for (Group group: groups) { if(group.isSelected()){ selecteds.add(group); }else{ for (Child child : group.getChilds()) { if(child.isSelected()){ selecteds.add(child); } } } } if(selecteds.size()>0){ for (Object object : selecteds) { if(object instanceof Group){ buffer.append(((Group)object).getGroupName()+"[组]、"); } if(object instanceof Child){ buffer.append(((Child)object).getChildName()+"、"); } } textView.setText(buffer.toString()); } } }
布局文件xml代码:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="5dp"
android:orientation="vertical"
tools:context="com.example.observer.ObserverActivity" >
<TextView
android:id="@+id/selectedview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="16sp"/>
<ExpandableListView
android:id="@+id/expandablelistview"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_marginTop="10dp"
android:groupIndicator="@null"/>
</LinearLayout>
最后是两个实体类的代码(两个实体类本身即属于观察者,又同时属于被观察者):
分组实体需要继承Observable类和实现Observer接口
package com.example.observer;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
import android.util.Log;
public class Group extends Observable implements Observer{
private String groupName;
private List<Child> childs;
private boolean isSelected;
public String getGroupName() {
return groupName;
}
public void setGroupName(String groupName) {
this.groupName = groupName;
}
public List<Child> getChilds() {
return childs;
}
public void setChilds(List<Child> childs) {
this.childs = childs;
}
public boolean isSelected() {
return isSelected;
}
public void setSelected(boolean isSelected) {
this.isSelected = isSelected;
}
public void changeChecked(){
isSelected=!isSelected;
setChanged();
notifyObservers(isSelected);
}
@Override
public void update(Observable observable, Object data) {
Log.i("YHW", "group update");
boolean flag=true;
for (Child child: childs) {
if(!child.isSelected()){
flag=false;
}
}
isSelected=flag;
}
}
子数据实体需要继承Observable类和实现Observer接口
<span style="color:#333333;">package com.example.observer;
import java.util.Observable;
import java.util.Observer;
import android.util.Log;
public class Child extends Observable implements Observer{
private String childName;
private boolean isSelected;
public String getChildName() {
return childName;
}
public void setChildName(String childName) {
this.childName = childName;
}
public boolean isSelected() {
return isSelected;
}
public void setSelected(boolean isSelected) {
this.isSelected = isSelected;
}
public void changeChecked(){
isSelected=!isSelected;
setChanged();
notifyObservers();
}
@Override
public void update(Observable observable,
968a
Object data) {
Log.i("YHW", "child update");
if(data instanceof Boolean){
isSelected=(Boolean) data;
}
}
}</span><span style="color:#ff0000;">
</span>
总结:
总体实现比较简单,就不做过多阐述了,主要就是通过观察者模式,实现分组数据和子数据之间互相监听选中与否
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法