2012年4月15日 星期日

ListView, CursorAdapter, ViewHolder

這次來說說CursorAdapter

當資料來源是cursor,顯示界面為ListView就可以很方便的使用CursorAdapter

extends CursorAdapter的時候需要override bindView()以及newView()

bindView會在顯示每一個item的時候被呼叫

newView則會在需要的時候被呼叫,譬如說第一次建立此位置的View時,或是此位置的View已經被回收時
@Override public void bindView(View view, Context context, Cursor cursor) { if (view == null || cursor == null) return; String bucketName = null, displayName = null; ... } @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { LayoutInflater inflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); return inflater.inflate(R.layout.media_item, null); }
如果總共有100個item,銀幕上最多顯示8個item

那畫面顯示出來時newView()/bindView()就會分別被呼叫8次,滑動時就只會呼叫bindView(),偶而才會呼叫newView()

Cursor, MergeCursor, MatrixCursor

新開了這個blog,用來記錄一下程式的相關筆記

主要是希望可以讓我這個有初老症的叔叔查閱用的

第一篇就來說說List跟Cursor吧

Cursor這基本的類別用法就不多說了,直接介紹一下MergeCursor

MergeCursor可以用來merge多個Cursor,只要在new MergeCursor時將Cursor Array帶入即可
void startQuery() { imageCursor = this.getContentResolver().query( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, imageProject, null, null, MediaStore.Images.Media.BUCKET_DISPLAY_NAME + " ASC, " + MediaStore.Images.Media.DISPLAY_NAME + " ASC"); videoCursor = this.getContentResolver().query( MediaStore.Video.Media.EXTERNAL_CONTENT_URI, videoProject, null, null, MediaStore.Video.Media.BUCKET_DISPLAY_NAME + " ASC, " + MediaStore.Video.Media.DISPLAY_NAME + " ASC"); mediaCursor = new MergeCursor(new Cursor[] {videoCursor, imageCursor}); tmpAdapter1.changeCursor(mediaCursor); }