CursorTreeAdapter 详解

    技术2022-05-20  33

    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            获取数据的游标对象,它已经移动到正确的位置

                                IsLastChild   子元素是否处于组中的最后一个

                                parent      新视图 (View)所依附于的父对象。

     

        protected abstract View newGroupView (Context context, Cursor cursor, boolean isExpanded, 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; } }

     

     

     


    最新回复(0)