[整理]什么场合适合用CurcorAdapter?

什么场合适合用CurcorAdapter?
ListView要读取数据表中的数据。
1.CursorAdapter的继承关系图
CursorAdapter继承于BaseAdapter,有一个直接子类SimpleCursorAdapter。
技术分享

2.CursorAdapter的用法

CursorAdapter继承了BaseAdapter后覆盖它的getView方法,在getView方法中调用了newView和bindView方法,我们在写CursorAdapter时必须实现这两个抽象方法源码如下:

/**  * @see android.widget.ListAdapter#getView(int, View, ViewGroup)  */ public View getView(int position, View convertView, ViewGroup parent) {
    if (!mDataValid) {
        throw new IllegalStateException("this should only be called when the cursor is valid");
    }
    if (!mCursor.moveToPosition(position)) {
        throw new IllegalStateException("couldn't move cursor to position " + position);
    }
    View v;
    if (convertView == null) {
        v = newView(mContext, mCursor, parent);
    } else {
        v = convertView;
    }
    bindView(v, mContext, mCursor);
    return v;
}

从源码的 getView( int position, View convertView, ViewGroup parent)方法中我们可以看出:
(1)newView:并不是每次都被调用的,它只在实例化的时候调用,数据增加的时候也会调用,但是在重绘(比如修改条目里的TextView的内容)的时候不会被调用;
(2)bindView:从代码中可以看出在绘制Item之前一定会调用bindView方法它在重绘的时候也同样被调用。

3. CursorAdapter还有一个重要的方法   public   void  changeCursor (Cursor cursor)
源码如下:
/**  * Change the underlying cursor to a new cursor. If there is an existing cursor it will be  * closed.  *  * @param cursor The new cursor to be used  */ public void changeCursor(Cursor cursor) {
    Cursor old = swapCursor(cursor);
    if (old != null) {
        old.close();
    }
}
/**  * Swap in a new Cursor, returning the old Cursor. Unlike  * {@link #changeCursor(Cursor)}, the returned old Cursor is <em>not</em>  * closed.  *  * @param newCursor The new cursor to be used.  * @return Returns the previously set Cursor, or null if there wasa not one.  * If the given new Cursor is the same instance is the previously set  * Cursor, null is also returned.  */ public Cursor swapCursor(Cursor newCursor) {
    if (newCursor == mCursor) {
        return null;
    }
    Cursor oldCursor = mCursor;
    if (oldCursor != null) {
        if (mChangeObserver != null) oldCursor.unregisterContentObserver(mChangeObserver);
        if (mDataSetObserver != null) oldCursor.unregisterDataSetObserver(mDataSetObserver);
    }
    mCursor = newCursor;
    if (newCursor != null) {
        if (mChangeObserver != null) newCursor.registerContentObserver(mChangeObserver);
        if (mDataSetObserver != null) newCursor.registerDataSetObserver(mDataSetObserver);
        mRowIDColumn = newCursor.getColumnIndexOrThrow("_id");
        mDataValid = true;
        // notify the observers about the new cursor
        notifyDataSetChanged();
    } else {
        mRowIDColumn = -1;
        mDataValid = false;
        // notify the observers about the lack of a data set
        notifyDataSetInvalidated();
    }
    return oldCursor;
}
调用此方法后会把当前的mCursor设置为新传过来的cursor,同时把原来的cursor返回并关闭。
作用:当我们的Cursor变化时调用此方法
adapter.changeCursor(cursor),它的功能类似于 adapter.notifyDataSetChanged()方法
4.Cursor的移动

cursor是怎么移动的?比方说cursor中有40条数据, 那么它是怎样一行一行移动cursor把这40条数据显示出来的?
getCount()方法中 return   mCursor .getCount();然后在getView方法的时候调用了 mCursor .moveToPosition(position)其实和BaseAdapter的原理是一样的,这样就可以一条一条的绘制条目了。

参考网址:http://www.bubuko.com/infodetail-734550.html



你可能感兴趣的:([整理]什么场合适合用CurcorAdapter?)