`

CursorTreeAdapter 详解

阅读更多

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.csdn.net/wanglong0537/article/details/6330676

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics