您的位置:首页 > 移动开发 > Android开发

Android ExpandableListView 带有Checkbox的简单应用

2014-04-27 13:03 483 查看
expandablelistview2_groups.xml

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

<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true" />

<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true" />

<CheckBox
android:id="@+id/checkBox1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toLeftOf="@id/imageView1"
android:focusable="false"
android:focusableInTouchMode="false" />

</RelativeLayout>


expandablelistview2_child.xml

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

<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true" />

<CheckBox
android:id="@+id/checkBox1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:clickable="false"
android:focusable="false"
android:focusableInTouchMode="false" />

</RelativeLayout>


Expandablelistview2Activity.java

package com.wangzhu.demoexpandablelistview;

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.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseExpandableListAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ExpandableListView;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class Expandablelistview2Activity extends Activity {

private final static String TAG = "Expandablelistview2Activity";
/**
* 定义组数据
*/
private List<String> groupDataList;
/**
* 定义组中的子数据
*/
private List<List<String>> childDataList;

private ExpandableListView expandableListView;
private ExpandableAdapter adapter;

/**
* 0:不可选 1:未选中 2:半选 3:选中
*/
private List<Map<Integer, Integer>> isSelectedList;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.expandablelistview1);
loadData();
expandableListView = (ExpandableListView) findViewById(R.id.expandableListView1);

// expandableListView.setGroupIndicator(getResources().getDrawable(
// R.drawable.indicator_selector));

expandableListView.setGroupIndicator(null);
adapter = new ExpandableAdapter();
expandableListView.setAdapter(adapter);
expandableListView
.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {

@Override
public void onGroupExpand(int groupPosition) {
// 只展开一个
for (int i = 0, count = expandableListView.getCount(); i < count; i++) {
if (groupPosition != i) {
expandableListView.collapseGroup(i);
}
}
}
});

expandableListView
.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {

@Override
public boolean onChildClick(ExpandableListView parent,
View v, int groupPosition, int childPosition,
long id) {
Toast.makeText(
Expandablelistview2Activity.this,
"onChildClick===="
+ adapter.getChild(groupPosition,
childPosition) + "===="
+ v.getParent(), Toast.LENGTH_LONG)
.show();
ViewHolder viewHolder = (ViewHolder) v.getTag();
viewHolder.checkBox.toggle();
if (viewHolder.checkBox.isChecked()) {
isSelectedList.get(groupPosition).put(
childPosition, 3);
} else {
isSelectedList.get(groupPosition).put(
childPosition, 1);
}
int count = 0;
for (int i = 0, size = isSelectedList
.get(groupPosition).size(); i < size; i++) {
if (isSelectedList.get(groupPosition).get(i) == 3) {
count++;
}
}
View view = (View) v.getParent();
Log.d(TAG, "view=" + view.findViewById(R.id.checkBox1));
CheckBox ck = (CheckBox) view
.findViewById(R.id.checkBox1);
if (count == isSelectedList.get(groupPosition).size()) {
// ck.setBackgroundResource(R.drawable.btn_select);
ck.setButtonDrawable(R.drawable.btn_select);
} else if (count > 0) {
// ck.setBackgroundResource(R.drawable.btn_half);
ck.setButtonDrawable(R.drawable.btn_half);
} else {
// ck.setBackgroundResource(R.drawable.btn_unselect);
ck.setButtonDrawable(R.drawable.btn_unselect);
}
adapter.notifyDataSetChanged();
return false;
}
});

isSelectedList = new ArrayList<Map<Integer, Integer>>();
for (int i = 0, icount = expandableListView.getCount(); i < icount; i++) {
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int j = 0, jcount = childDataList.get(i).size(); j < jcount; j++) {
map.put(j, 1);
}
isSelectedList.add(map);
}
}

/**
* 全部展开或关闭
*
* @param flag
*/
private void showOrhide(boolean flag) {
for (int i = 0, count = expandableListView.getCount(); i < count; i++) {
if (flag) {
expandableListView.expandGroup(i);
} else {
expandableListView.collapseGroup(i);
}
}
}

private void loadData() {
groupDataList = new ArrayList<String>();
groupDataList.add("国家");
groupDataList.add("人物");
groupDataList.add("武器");

childDataList = new ArrayList<List<String>>();

List<String> child1 = new ArrayList<String>();
child1.add("魏国");
child1.add("蜀国");
child1.add("吴国");
childDataList.add(child1);

List<String> child2 = new ArrayList<String>();
child2.add("关羽");
child2.add("张飞");
child2.add("典韦");
child2.add("吕布");
child2.add("曹操");
child2.add("甘宁");
child2.add("郭嘉");
child2.add("周瑜");
childDataList.add(child2);

List<String> child3 = new ArrayList<String>();
child3.add("青龙偃月刀");
child3.add("丈八蛇矛枪");
child3.add("青钢剑");
child3.add("麒麟弓");
child3.add("银月枪");
childDataList.add(child3);
}

private class ExpandableAdapter extends BaseExpandableListAdapter {

@Override
public int getGroupCount() {
return groupDataList.size();
}

@Override
public int getChildrenCount(int groupPosition) {
return childDataList.get(groupPosition).size();
}

@Override
public Object getGroup(int groupPosition) {
return groupDataList.get(groupPosition);
}

@Override
public Object getChild(int groupPosition, int childPosition) {
return childDataList.get(groupPosition).get(childPosition);
}

@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}

@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}

@Override
public boolean hasStableIds() {
return false;
}

@Override
public View getGroupView(final int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {

Log.d(TAG, "getGroupView");
ViewHolder viewHolder = null;
if (null == convertView) {
convertView = View.inflate(Expandablelistview2Activity.this,
R.layout.expandablelistview2_groups, null);
viewHolder = new ViewHolder();
viewHolder.textView = (TextView) convertView
.findViewById(R.id.textView1);
viewHolder.checkBox = (CheckBox) convertView
.findViewById(R.id.checkBox1);
viewHolder.imageView = (ImageView) convertView
.findViewById(R.id.imageView1);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}

viewHolder.textView.setText(groupDataList.get(groupPosition));
viewHolder.checkBox
.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
int flag = 0;
if (isChecked) {
flag = 3;
} else {
flag = 1;
}
for (int i = 0, size = isSelectedList.get(
groupPosition).size(); i < size; i++) {
isSelectedList.get(groupPosition).put(i, flag);
}
notifyDataSetChanged();
}
});
int size = 0;
for (int i = 0, count = isSelectedList.get(groupPosition).size(); i < count; i++) {
if (isSelectedList.get(groupPosition).get(i) == 3) {
size++;
}
}
if (size == isSelectedList.get(groupPosition).size()) {
// viewHolder.checkBox
// .setBackgroundResource(R.drawable.btn_select);
viewHolder.checkBox.setButtonDrawable(R.drawable.btn_select);
} else if (size > 0) {
// viewHolder.checkBox.setBackgroundResource(R.drawable.btn_half);
viewHolder.checkBox.setButtonDrawable(R.drawable.btn_half);
} else {
// viewHolder.checkBox
// .setBackgroundResource(R.drawable.btn_unselect);
viewHolder.checkBox.setButtonDrawable(R.drawable.btn_unselect);
}

// 判断isExpanded就可以控制是按下还是关闭,同时更换图片
if (isExpanded) {
viewHolder.imageView
.setBackgroundResource(R.drawable.shangiantou);
} else {
viewHolder.imageView
.setBackgroundResource(R.drawable.xiajiantou);
}

return convertView;
}

@Override
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {

Log.d(TAG, "getChildView");
// TextView textView = null;
// if (null != convertView) {
// textView = (TextView) convertView;
// textView.setText(childDataList.get(groupPosition).get(
// childPosition));
// } else {
// textView = createView(childDataList.get(groupPosition).get(
// childPosition));
// }
// return textView;

ViewHolder viewHolder = null;
if (null == convertView) {
convertView = View.inflate(Expandablelistview2Activity.this,
R.layout.expandablelistview2_child, null);
viewHolder = new ViewHolder();
viewHolder.textView = (TextView) convertView
.findViewById(R.id.textView1);

viewHolder.checkBox = (CheckBox) convertView
.findViewById(R.id.checkBox1);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}

if (isSelectedList.get(groupPosition).get(childPosition) == 3) {
// viewHolder.checkBox
// .setBackgroundResource(R.drawable.btn_select);
// 更改CheckBox的外观
viewHolder.checkBox.setButtonDrawable(R.drawable.btn_select);
} else {
// viewHolder.checkBox
// .setBackgroundResource(R.drawable.btn_unselect);
viewHolder.checkBox.setButtonDrawable(R.drawable.btn_unselect);
}
viewHolder.textView.setText(childDataList.get(groupPosition).get(
childPosition));
return convertView;
}

@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}

private TextView createView(String content) {
TextView textView = null;
AbsListView.LayoutParams layoutParams = new AbsListView.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, 80);
textView = new TextView(Expandablelistview2Activity.this);
textView.setLayoutParams(layoutParams);
textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
textView.setPadding(80, 0, 0, 0);
textView.setText(content);
return textView;
}

}

private class ViewHolder {
TextView textView;
CheckBox checkBox;
ImageView imageView;
}
}


所需图片:

没有好的图标,故随便找了几张先顶一下,嘿嘿!

Checkbox的半选图标:



Checkbox的选中图标:



Checkbox的未选中图标:







备注:

是否发现缺少了一个主布局文件(expandablelistview1.xml)?它在我的前一篇中,这两篇所用都是同一个主布局文件。

简单的实现了一下,请各位多多指教,菜鸟在这儿恭候!

效果图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: