CursorTreeAdapter 通过该适配类可以用一连续的游标 (Coursor)对象访问数据库,并将查询出来的数据展示到可伸缩的列表视图 (ExpandableListView)部件上。顶层游标 (Cursor)对象 (在构造器中指定 )显示全部组,后面的游标 (Cursor)对象
从getChildrenCursor(Cursor)
获取并展示子元素组。其中游标携带的结果集中必须有个名为“ _id”的列,否则这个类不起任何作用
结构:
public abstract class CusrorTreeAdapter
extends BaseExpandableListAdpater implements Filterable
java.lang.Object
android.widget.BaseExpandableListAdapter
android.widget.CursorTreeAdapter
直接子类
ResourceCursorTreeAdapter
间接子类
SimpleCursorTreeAdapter
构造函数
public CursorTreeAdapter (Cursor cursor, Context context)
构造函数。每当数据库的数据发生改变时,适配器将调用 requery()重新查询以显示最新的数据。
参数:
cursor 为组 (groups)提供数据的游标 (Coursor)
context 应用程序上下文。
public CursorTreeAdapter (Cursor cursor, Context context, boolean autoRequery)
构造函数。
参数:
cursor 为组 (groups)提供数据的游标 (Coursor)
context 应用程序上下文。
autoRequery 设置为 true时,每当数据库的数据发生改变时,适配器将调用 requery()重新查询以显示最新的数据。
抽象方法:
protected abstract void bindChildView (View view, Context context, Cursor cursor, boolean isLastChild)
用游标 (Coursor)的方式将子元素数据绑定在一个已存在的视图 (View)对象上。
参数:
view 已存在的视图 (View)对象 , 也就是之前 new出来的。
context 应用程序上下文对象
cursor 获取数据的游标对象,它已经移动到正确的位置
IsLastChild 子元素是否处于组中的最后一个
protected abstract void bindGroupView (View view, Context context, Cursor cursor, boolean isExpanded)
用游标 (Coursor)的方式将组数据绑定在一个已存在的视图 (View)对象上。
参数:
view 已存在的组视图 (View)对象 , 也就是早先 new出来的。
context 应用程序上下文对象,它已经移动到正确的位置
cursor 获取数据的游标对象
isExpanded 该组是展开状态还是伸缩状态
protected abstract Cursor getChildrenCursor (Cursor groupCursor)
获取指定组中的子元素游标对象。子类必须实现这个方法,用于在指定组中返回子元素数据。
如果你想用异步查询的方式避免 UI阻塞的情况发生,可能会返回 null或是在稍后调用 setChildrenCursor(int, Cursor) 。
你有责任在 Activity生命周期中管理这个游标对象,有一个非常好的思路:使用 managedQuery(Uri, String[], String, String[], String) 来管理它们。 在某些情况下,适配器本身会使游标停止工作,但这个特例不会总是出现,所以我们要确保有效地管理好游标对象。
参数:
groupCursor 组游标对象,决定返回哪个组中的子元素游标对象。
返回值:
返回指定组中的子元素游标对象或者为 null。
protected abstract View newChildView (Context context, Cursor cursor, boolean isLastChild, ViewGroup parent)
创建一个新的子元素视图并持有指向数据的游标 cursor。
参数:
context 应用程序上下文对象
cursor 获取数据的游标对象,它已经移动到正确的位置
isExpanded 该组是否展开状态
parent 新视图 (View) 所依附于的父对象。
用法 这里主要是实现这几个抽象方法
public class CursorTreeAdapterExample extends CursorTreeAdapter {
private int mGroupIdColumnIndex;
private LayoutInflater mInflater;
//注意这里的游标是一级项的
public CursorTreeAdapterExample(Cursor cursor, Context context) {
super(cursor, context);
mGroupIdColumnIndex = cursor.getColumnIndexOrThrow(Phone._ID);
mInflater = (LayoutInflater) context.getSystemService(LAYOUT_INFLATER_SERVICE);
}
//注意这里的游标是二级项的
@Override
protected void bindChildView(View view, Context context, Cursor cursor, boolean isExpanded) {
// Bind the related data with this child view
((TextView)view).setText(cursor.getString(cursor.getColumnIndex(Phone.NUMBER)));
}
@Override
protected void bindGroupView(View view, Context context, Cursor cursor, boolean isExpanded) {
// Bind the related data with this group view
((TextView)view).setText(cursor.getString(cursor.getColumnIndex(Phone.DISPLAY_NAME)));
}
//注意这里通过一次数据库查询才得到了二级项的数据
@Override
protected Cursor getChildrenCursor(Cursor groupCursor) {
Uri.Builder builder = Phone.CONTENT_URI.buildUpon();
ContentUris.appendId(builder, groupCursor.getLong(mGroupIdColumnIndex));
Uri phoneNumbersUri = builder.build();
// The returned Cursor MUST be managed by us, so we use Activity's helper
// functionality to manage it for us.
return managedQuery(phoneNumbersUri, new String[] {Phone._ID, Phone.NUMBER}, null, null, null);
}
@Override
protected View newChildView(Context context, Cursor cursor, boolean isExpanded, ViewGroup parent) {
Log.d(TAG, "newChildView");
TextView view = (TextView) mInflater.inflate(android.R.layout.simple_expandable_list_item_1, parent, false);
view.setText(" (" + cursor.getPosition() + ") " + cursor.getString(cursor.getColumnIndex(Phone.NUMBER)));
return view;
}
@Override
protected View newGroupView(Context context, Cursor cursor, boolean isExpanded, ViewGroup parent) {
Log.d(TAG, "newGroupView");
TextView view = (TextView) mInflater.inflate(android.R.layout.simple_expandable_list_item_1, parent, false);
view.setText(" (" + cursor.getPosition() + ") " + cursor.getString(cursor.getColumnIndex(Phone.DISPLAY_NAME)));
return view;
}
}
本文摘自:http://blog.youkuaiyun.com/wanglong0537/article/details/6330676