先上图再说,实现效果如下图,选项可多少可变化。
BaseExpandableListAdapter实现
Java代码
import java.util.List;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;
import com.iwidsets.clear.manager.R;
import com.iwidsets.clear.manager.adapter.BrowserInfo;
public class ClearExpandableListAdapter extends BaseExpandableListAdapter {
class ExpandableListHolder {
ImageView appIcon;
TextView appInfo;
CheckBox appCheckBox;
}
private Context context;
private LayoutInflater mChildInflater;
private LayoutInflater mGroupInflater;
private List<GroupInfo> group;
public ClearExpandableListAdapter(Context c, List<GroupInfo> group) {
this.context = c;
mChildInflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mGroupInflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.group = group;
}
public Object getChild(int childPosition, int itemPosition) {
return group.get(childPosition).getChild(itemPosition);
}
public long getChildId(int childPosition, int itemPosition) {
return itemPosition;
}
@Override
public int getChildrenCount(int index) {
return group.get(index).getChildSize();
}
public Object getGroup(int index) {
return group.get(index);
}
public int getGroupCount() {
return group.size();
}
public long getGroupId(int index) {
return index;
}
public View getGroupView(int position, boolean flag, View view,
ViewGroup parent) {
ExpandableListHolder holder = null;
if (view == null) {
view = mGroupInflater.inflate(
R.layout.browser_expandable_list_item, null);
holder = new ExpandableListHolder();
holder.appIcon = (ImageView) view.findViewById(R.id.app_icon);
view.setTag(holder);
holder.appInfo = (TextView) view.findViewById(R.id.app_info);
holder.appCheckBox = (CheckBox) view
.findViewById(R.id.app_checkbox);
} else {
holder = (ExpandableListHolder) view.getTag();
}
GroupInfo info = this.group.get(position);
if (info != null) {
holder.appInfo.setText(info.getBrowserInfo().getAppInfoId());
Drawable draw = this.context.getResources().getDrawable(
info.getBrowserInfo().getImageId());
holder.appIcon.setImageDrawable(draw);
holder.appCheckBox.setChecked(info.getBrowserInfo().isChecked());
}
return view;
}
public boolean hasStableIds() {
return false;
}
public boolean isChildSelectable(int arg0, int arg1) {
return false;
}
@Override
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
ExpandableListHolder holder = null;
if (convertView == null) {
convertView = mChildInflater.inflate(
R.layout.browser_expandable_list_item, null);
holder = new ExpandableListHolder();
holder.appIcon = (ImageView) convertView
.findViewById(R.id.app_icon);
convertView.setTag(holder);
holder.appInfo = (TextView) convertView.findViewById(R.id.app_info);
holder.appCheckBox = (CheckBox) convertView
.findViewById(R.id.app_checkbox);
} else {
holder = (ExpandableListHolder) convertView.getTag();
}
BrowserInfo info = this.group.get(groupPosition)
.getChild(childPosition);
if (info != null) {
holder.appInfo.setText(info.getAppInfoId());
Drawable draw = this.context.getResources().getDrawable(
info.getImageId());
holder.appIcon.setImageDrawable(draw);
holder.appCheckBox.setChecked(info.isChecked());
}
return convertView;
}
}
要想让child获得焦点,只在改
Java代码
public boolean isChildSelectable(int arg0, int arg1) {
return true;
}
browser_expandable_list_item.xml 用于显示每一个ITEM的XML
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="wrap_content"
android:orientation="horizontal" android:minHeight="40px"
android:layout_gravity="center_vertical">
<CheckBox android:id="@+id/app_checkbox" android:focusable="false"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="35px" android:checked="true"/>
<ImageView android:id="@+id/app_icon" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_gravity="center_vertical" />
<TextView android:id="@+id/app_info" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:textColor="?android:attr/textColorPrimary"
android:paddingLeft="3px" android:layout_gravity="center_vertical" />
</LinearLayout>
browserlayout.xml 用于显示整个界面
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="vertical">
<ExpandableListView android:id="@+id/appList"
android:layout_width="fill_parent" android:layout_height="0dip"
android:layout_weight="1" />
<LinearLayout android:layout_height="wrap_content"
android:layout_width="fill_parent" android:paddingLeft="4dip"
android:paddingRight="4dip" android:paddingBottom="1dip"
android:paddingTop="5dip" android:background="@android:drawable/bottom_bar"
android:id="@+id/app_footer">
<Button android:layout_weight="1" android:id="@+id/btn_export"
android:layout_width="0dip" android:layout_height="fill_parent"
android:text="@string/clear"></Button>
<Button android:layout_weight="1" android:id="@+id/btn_sel_all"
android:layout_width="0dip" android:layout_height="fill_parent"
android:text="select_all"></Button>
<Button android:layout_weight="1" android:id="@+id/btn_desel_all"
android:layout_width="0dip" android:layout_height="fill_parent"
android:text="deselect_all"></Button>
</LinearLayout>
</LinearLayout>
BrowserInfo用于提供一个项的信息
Java代码
public class BrowserInfo {
private int appInfoId;
private int imageId;
private boolean checked;
public BrowserInfo(int appInfoId, int imageId, boolean checked) {
this.appInfoId = appInfoId;
this.imageId = imageId;
this.checked = checked;
}
public boolean isChecked() {
return checked;
}
public void setChecked(boolean checked) {
this.checked = checked;
}
public int getAppInfoId() {
return appInfoId;
}
public void setAppInfoId(int appInfoId) {
this.appInfoId = appInfoId;
}
public int getImageId() {
return imageId;
}
public void setImageId(int imageId) {
this.imageId = imageId;
}
}
GroupInfo 用于显示一个组的信息
Java代码
import java.util.List;
public class GroupInfo {
private BrowserInfo group;
private List<BrowserInfo> child;
public GroupInfo(BrowserInfo group, List<BrowserInfo> child) {
this.group = group;
this.child = child;
}
public void add(BrowserInfo info){
child.add(info);
}
public void remove(BrowserInfo info){
child.remove(info);
}
public void remove(int index){
child.remove(index);
}
public int getChildSize(){
return child.size();
}
public BrowserInfo getChild(int index){
return child.get(index);
}
public BrowserInfo getBrowserInfo() {
return group;
}
public void setBrowserInfo(BrowserInfo group) {
this.group = group;
}
public List<BrowserInfo> getChild() {
return child;
}
public void setChild(List<BrowserInfo> child) {
this.child = child;
}
}
ClearBrowserActivity 最后就是把要显示的内容显示出来的。
Java代码
public class ClearBrowserActivity extends Activity implements ExpandableListView.OnGroupClickListener,ExpandableListView.OnChildClickListener{
private List<GroupInfo> group;
private ClearExpandableListAdapter listAdapter = null;
private ExpandableListView appList;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.browserlayout);
appList = (ExpandableListView) findViewById(R.id.appList);
init();
BrowserInfo browsingHistoryParents = newBrowserInfo(
R.string.browsinghistory, R.drawable.browser_image,true);
List<BrowserInfo> browsingHistoryChild = new ArrayList<BrowserInfo>();
BrowserInfo browser = newBrowserInfo(R.string.browser,
R.drawable.browser_image, true);
browsingHistoryChild.add(browser);
BrowserInfo operaClear = newBrowserInfo(R.string.opera_clear,
R.drawable.browser_image,true);
browsingHistoryChild.add(operaClear);
BrowserInfo firefoxClear = newBrowserInfo(R.string.firefox_clear,
R.drawable.browser_image,true);
browsingHistoryChild.add(firefoxClear);
BrowserInfo ucwebClear = newBrowserInfo(R.string.ucweb_clear,
R.drawable.browser_image,false);
browsingHistoryChild.add(ucwebClear);
GroupInfo browserGroup = new GroupInfo(browsingHistoryParents,
browsingHistoryChild);
addGroup(browserGroup);
listAdapter = new ClearExpandableListAdapter(this, group);
appList.setOnChildClickListener(this);
appList.setOnGroupClickListener(this);
appList.setAdapter(listAdapter);
}
private void init() {
group = new ArrayList<GroupInfo>();
}
private void addGroup(GroupInfo info) {
group.add(info);
}
private static BrowserInfo newBrowserInfo(int infoId, int imageId,boolean checked) {
return new BrowserInfo(infoId, imageId,checked);
}
@Override
public boolean onGroupClick(ExpandableListView parent, View v,
int groupPosition, long id) {
return false;
}
@Override
public boolean onChildClick(ExpandableListView parent, View v,
int groupPosition, int childPosition, long id) {
return false;
}
}