`
fonter
  • 浏览: 868263 次
  • 性别: 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
分享到:
评论
25 楼 gf_crazy 2011-10-21  
找了好久,终于找到了!哈
24 楼 fonter 2011-09-19  
安轩之 写道
你好。现在有个棘手的问题。想请教一下:比如点击某个item父类时,怎么让他直接跳到(显示)你点击的那个item父类并展示出子类的内容,在此过程中并把前面的一些item父类(包括子类)隐藏掉 。QQ 375290562,看到留言,请Q我。非常的感谢。

Activity implements OnItemClickListener类,如下面例子

public void onItemClick(AdapterView<?> ada, View v, int index,
			long indexLong) {
		// TODO Auto-generated method stub
		currentArchiveInfo = (ArchiveInfo) archiveAdapter.getItem(index);
		if (currentArchiveInfo != null) {
			if (currentArchiveInfo.isDirectory()) {
				rootPath = rootPath + currentArchiveInfo.getName();
				setTitle("  " + getString(R.string.archive_browse) + " -- "
						+ rootPath);
				// Log.e("rootPath", "rootPath=" + rootPath);
				browse();
			} else {
				unFileThread(currentArchiveInfo);

			}

		}
	}
23 楼 安轩之 2011-09-18  
你好。现在有个棘手的问题。想请教一下:比如点击某个item父类时,怎么让他直接跳到(显示)你点击的那个item父类并展示出子类的内容,在此过程中并把前面的一些item父类(包括子类)隐藏掉 。QQ 375290562,看到留言,请Q我。非常的感谢。
22 楼 大柳树 2011-07-03  
赞一个先~~~
21 楼 fonter 2010-10-04  
DerekGuoLZU 写道
您好!我能否发个您写过的一个Demo给我们参考一下,谢谢!

最近比较忙,应该没什么时间帮你哦。。。
20 楼 DerekGuoLZU 2010-10-03  
您好!那个点组的时候也不能展开……
19 楼 DerekGuoLZU 2010-10-03  
您好!我能否发个您写过的一个Demo给我们参考一下,谢谢!
18 楼 fonter 2010-10-03  
自定义的布局文件中是否需要
DerekGuoLZU 写道
您好!在自定义的布局文件中是否需要什么特殊的属性配置?其他的问题实在是想不到了……

还是不行吗。。。我也是这样的啊。。那就奇怪了。。
17 楼 DerekGuoLZU 2010-10-03  
您好!在自定义的布局文件中是否需要什么特殊的属性配置?其他的问题实在是想不到了……
16 楼 DerekGuoLZU 2010-10-03  
你好!我在程序中有设置这两个函数的返回值为true
15 楼 fonter 2010-10-03  
要想让child获得焦点,只在改

Java代码
public boolean isChildSelectable(int arg0, int arg1) {  
    return true;  


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

DerekGuoLZU 写道
我的意思是虽然注册了ExpandableListView.OnGroupClickListener和
ExpandableListView.OnGroupCollapseListener
,但这两个监听类的onGroupClick和onChildClick方法并未被调用,以至于无法响应单击事件……


要想让child获得焦点,只在改



Java代码
public boolean isChildSelectable(int arg0, int arg1) {  
    return true;  


14 楼 DerekGuoLZU 2010-10-02  
我的意思是虽然注册了ExpandableListView.OnGroupClickListener和
ExpandableListView.OnGroupCollapseListener
,但这两个监听类的onGroupClick和onChildClick方法并未被调用,以至于无法响应单击事件……

13 楼 fonter 2010-10-02  
DerekGuoLZU 写道
您好!看了上面的文章受益匪浅,但本人还有个疑问,还请指教:仿照上面的方法进行开发时,当点击组和小孩时,实现的onGroupClick和onChildClick方法并未被调用,还请指导,谢谢!

DerekGuoLZU 写道
您好!看了上面的文章受益匪浅,但本人还有个疑问,还请指教:仿照上面的方法进行开发时,当点击组和小孩时,实现的onGroupClick和onChildClick方法并未被调用,还请指导,谢谢!

我用到是的目前这两个

ExpandableListView.OnGroupClickListener,
ExpandableListView.OnGroupCollapseListener

你可以改改试试。。文章是我第一次搞时的代码,有些方法可接口可能没用。。。

12 楼 DerekGuoLZU 2010-10-02  
您好!看了上面的文章受益匪浅,但本人还有个疑问,还请指教:仿照上面的方法进行开发时,当点击组和小孩时,实现的onGroupClick和onChildClick方法并未被调用,还请指导,谢谢!
11 楼 fonter 2010-07-18  
Zoeh-ruan 写道
因为这个卡关好久了   太感谢了  

客气了客气了...哈哈
10 楼 Zoeh-ruan 2010-07-18  
因为这个卡关好久了   太感谢了  
9 楼 fonter 2010-07-15  
Zoeh-ruan 写道
太感谢你了
又学了一课
不过有个疑问的点是
似乎没有看到getboolean的地方
那group在展开的时候为什么能够直接抓到DB中的isChecked()值呢?

Zoeh-ruan 写道
太感谢你了
又学了一课
不过有个疑问的点是
似乎没有看到getboolean的地方
那group在展开的时候为什么能够直接抓到DB中的isChecked()值呢?



DriverInfo.getSharedPreferences().getBoolean


8 楼 Zoeh-ruan 2010-07-15  
太感谢你了
又学了一课
不过有个疑问的点是
似乎没有看到getboolean的地方
那group在展开的时候为什么能够直接抓到DB中的isChecked()值呢?
7 楼 fonter 2010-07-13  
Zoeh-ruan 写道
请问"在一个类里写一个全局的如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,一直不知道为什么   麻烦了


对了记得在Adapter 上加一个事件

			holder.appCheckBox.setOnClickListener(new OnClickListener() {

				public void onClick(View v) {
					info.setChecked(!info.isChecked());
}
}
6 楼 fonter 2010-07-13  
Zoeh-ruan 写道
请问"在一个类里写一个全局的如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,一直不知道为什么   麻烦了


我把我的code贴出来给你看吧,你参考一下
	private void saveCheckSettings() {
		Editor editor = DriverInfo.getSharedPreferences().edit();
		List<GroupInfo> list = listAdapter.getGroup();
		for (GroupInfo info : list) {
			if (info != null) {
				editor.putBoolean(info.getBrowserInfo().getValue(), info
						.getBrowserInfo().isChecked());
				List<BrowserInfo> bList = info.getChild();
				for (BrowserInfo bin : bList) {
					if (bin != null) {
						editor.putBoolean(bin.getValue(), bin.isChecked());
					}
				}
			}
		}
		editor.commit();
	}


然后,这个是全局

public class DriverInfo {

	private static int width;
	private static int height;
	private static SharedPreferences sharedPreferences;
	private static String DB = "AndClearDB";

	public static void init(Activity activity) {
		width = activity.getWindowManager().getDefaultDisplay().getWidth();
		height = activity.getWindowManager().getDefaultDisplay().getHeight();
		sharedPreferences = activity.getSharedPreferences(DB,
				Context.MODE_PRIVATE);
	}
	
	public static SharedPreferences getSharedPreferences() {
		return sharedPreferences;
	}

	public static void setSharedPreferences(SharedPreferences sharedPreferences) {
		DriverInfo.sharedPreferences = sharedPreferences;
	}

	public static int getWidth() {
		return width;
	}

	public static int getHeight() {
		return height;
	}

}



有什么问题可以问

相关推荐

    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