`
fonter
  • 浏览: 868268 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Android BaseExpandableListAdapter 教程

阅读更多

先上图再说,实现效果如下图,选项可多少可变化。

 

 

 

BaseExpandableListAdapter实现

 

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获得焦点,只在改

 

	public boolean isChildSelectable(int arg0, int arg1) {
		return true;
	}

  

 

browser_expandable_list_item.xml 用于显示每一个ITEM的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 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用于提供一个项的信息

 

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 用于显示一个组的信息

 

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 最后就是把要显示的内容显示出来的。

 

 

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

 

 

 

 

  • 大小: 19.3 KB
分享到:
评论
5 楼 Zoeh-ruan 2010-07-13  
请问"在一个类里写一个全局的如SharedPreferences sharedPreferences = activity.getSharedPreferences("SHRAREDNAME",Context.MODE_PRIVATE);"
意思是像下面的CODE一样另外写一个class去抓值,然后在isChecked()去呼叫吗?

public class SharedPreference extends Activity{
public boolean getPref(String value){
SharedPreferences settings=getSharedPreferences("Preference_bool",0);
boolean b = settings.getBoolean("a01",false);
return b;
}
}
public boolean isChecked() {
SharedPreference test = new SharedPreference();
checked = test.getPref(value);
Log.d("isC","isc :"+checked);
return checked;
}

另一个问题就是除了在ClearBrowserActivity里面使用去SharedPreferences settings=getSharedPreferences("Preference_bool",Context.MODE_PRIVATE);之外,
在其它的JAVA档里使用上面的CODE开启模拟器之后,都会runtime exception,一直不知道为什么   麻烦了
4 楼 fonter 2010-07-13  
Zoeh-ruan 写道
您好
不好意思
我了解了做法的意思 但是一直出现错误
"checked保存在SharedPreferences"
我在 BrowserInfo里getSharedPreferences总是出现错误
不知道能不能给点更详细的方法呢?
谢谢

你在BrowserInfo都有一个SharedPreferences吗?如果是这样,就错了,你可在一个类里写一个全局的如SharedPreferences sharedPreferences = activity.getSharedPreferences("SHRAREDNAME",Context.MODE_PRIVATE); 然后可用一个for把他的唯一标识做为名,如putBoolean("name",true) 这样就做保存到SharedPreferences了,读的话也差不多.
3 楼 Zoeh-ruan 2010-07-13  
您好
不好意思
我了解了做法的意思 但是一直出现错误
"checked保存在SharedPreferences"
我在 BrowserInfo里getSharedPreferences总是出现错误
不知道能不能给点更详细的方法呢?
谢谢
2 楼 fonter 2010-07-12  
Zoeh-ruan 写道
请问
这个CODE收回再展开之后
要如何保存checkbox的状态呢?
不知道为什么下面那三个按钮也是没有反应呢@ @ ?

1、下面三个按钮没做处理事件啊。。这个代码只是我的最初的,所以一些CODE还是得自己加;

2、我是这样做的,在BrowserInfo再加一个字段为value,这个value为唯一的,把checked保存在SharedPreferences中,用putBoolean。
1 楼 Zoeh-ruan 2010-07-12  
请问
这个CODE收回再展开之后
要如何保存checkbox的状态呢?
不知道为什么下面那三个按钮也是没有反应呢@ @ ?

相关推荐

    Android BaseExpandableListAdapter 教程.doc

    在Android开发中,`BaseExpandableListAdapter`是一个用于创建可扩展列表视图(ExpandableListView)的数据适配器。这个适配器允许开发者构建复杂的列表结构,其中包含可展开和折叠的组(groups),每个组内又包含多...

    MonoAndroid:在C#中编写ExpandableListView和BaseExpandableListAdapter

    `MonoAndroid-Writing-ExpandableListView-amd.pdf`可能是一份详细的教程或指南,建议阅读以获取更深入的理解。 总的来说,使用C#在MonoAndroid环境中实现`ExpandableListView`需要理解Android视图系统、适配器模式...

    带有Android自定义适配器的Android ExpandablelistView教程

    在"带有Android自定义适配器的Android ExpandablelistView教程"中,我们将深入探讨如何有效地利用`ExpandableListView`。 首先,理解`ExpandableListView`的基本工作原理是关键。它由两部分组成:父条目(Group)和...

    Android常用控件(能折叠的ListView)--ExpandableListView的使用模仿QQ好友

    本教程将详细介绍如何在Android应用中使用ExpandableListView来创建类似QQ好友管理的功能。 **1. ExpandableListView的基本概念** ExpandableListView是ListView的一个扩展,它支持分组和子项的概念。每个分组都...

    Android expandableList扩展列表.rar

    `Android expandableList扩展列表.rar`文件中的内容可能包含了如何在Android应用中实现和优化ExpandableListView的详细教程。 首先,让我们了解一下ExpandableListView的基本用法。在Android中,使用...

    Android扩展BaseExpandableListAdpter实现ExpandableAdapter

    本教程将深入探讨如何通过扩展`BaseExpandableListAdapter`来实现自定义的`ExpandableAdapter`。 首先,`BaseExpandableListAdapter`是Android提供的一个抽象类,它是`ExpandableListAdapter`接口的默认实现,提供...

    android 时间轴效果Demo(ExpandableListView实现)

    本教程将详细介绍如何使用ExpandableListView组件来实现一个Android时间轴效果,并支持标题置顶功能。 首先,我们需要了解ExpandableListView。它是Android SDK提供的一种可扩展的列表视图,允许你显示分组数据,每...

    Android ListView城市列表,按a-z分组字母索引排序

    我们还需要为ListView创建一个Adapter,继承自BaseExpandableListAdapter,重写其方法以填充数据。 在Adapter中,我们需要注意以下几点: 1. `getGroupCount()`:返回分组的数量,即字母表的长度。 2. `...

    Android源码——expandableList扩展列表.zip

    "Android expandableList扩展列表"可能是相关的代码示例或者教程文档,帮助开发者更好地理解和实践`ExpandableListView`的使用。 总之,`ExpandableListView`是Android中处理层级数据的强大工具,通过深入学习和...

    android Expandablelistview使用

    在Android中,这通常是通过继承`BaseExpandableListAdapter`实现的。适配器需要重写以下几个关键方法: 1. `getGroupCount()`:返回父组的数量。 2. `getChildrenCount(int groupPosition)`:返回给定父组下的子项...

    Android代码-expandableList扩展列表.zip

    这个"Android代码-expandableList扩展列表.zip"压缩包很可能包含了一个关于如何使用ExpandableListView的示例项目或教程。 在Android的ExpandableListView中,数据模型通常由两个类组成:一个表示父组(Group)的类...

    Android expandableList扩展列表.zip

    本教程将深入探讨如何在Android应用中使用ExpandableListView及其相关的知识点。 1. **ExpandableListView介绍** ExpandableListView是Android提供的一个可展开的列表视图,它继承自ListView。与普通ListView不同...

    Android 开发技巧

    4.6.10、BaseExpandableListAdapter例 88 4.6.11、列表视图(List View) 96 4.6.12、NoteList 99 4.7、TAB与TABHOST 106 4.8、RATINGBAR 110 4.8.1、例一 110 4.8.2、例二 112 4.9、DATE/TIME SET 115 4.9.1、...

    android ExpandableListView三级菜单的使用

    本教程将详细介绍如何在Android应用中实现一个三级菜单的`ExpandableListView`。 首先,`ExpandableListView`的核心特性在于它支持子项的展开和收起,这对于展示多级菜单非常实用。在Android的`ExpandableListView`...

    分享Android中ExpandableListView控件使用教程

    本教程将深入讲解如何在Android应用中使用`ExpandableListView`。 首先,我们需要在布局文件中添加`ExpandableListView`。例如,在 `main.xml` 文件中,我们创建了一个`LinearLayout` 并在其内部嵌入了一个`...

    安卓Android源码——自定义适配器的ExpandableListView.zip

    这个压缩包文件"安卓Android源码——自定义适配器的ExpandableListView.zip"包含了一份关于如何在Android应用中自定义适配器以实现`ExpandableListView`功能的详细教程和示例代码。 首先,我们要理解`...

    安卓开发-android基于自定义适配器的ExpandableListView.zip.zip

    在这个“安卓开发-android基于自定义适配器的ExpandableListView.zip”压缩包中,我们很可能会找到关于如何实现自定义适配器以驱动ExpandableListView的示例代码和教程。 首先,让我们理解ExpandableListView的工作...

    Android 仿QQ多级列表框源码.zip

    - 自定义适配器需要扩展BaseExpandableListAdapter,并重写相关方法,如getGroupCount()、getChildrenCount()、getGroupView()和getChildView()。在getGroupView()中,我们设置父项的视图,而在getChildView()中...

Global site tag (gtag.js) - Google Analytics