標籤:姓名 span bst service name pos ext android tac
CursorAdapter繼承於BaseAdapter,為Cursor和ListView串連提供了橋樑。
首先看一下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; }
可以看出CursorAdapter是繼承了BaseAdapter後覆蓋它的getView方法在getView方法中調用了newView和bindView方法,我們在寫CursorAdapter時必須實現它的兩個方法。
public abstract View newView (Context context, Cursor cursor, ViewGroup parent); public abstract void bindView(View view, Context context, Cursor cursor);
從源碼可以看出:
- newView ( ):並不是每次都被調用的,它只在執行個體化的時候調用,資料增加的時候也會調用,但是在重繪(比如修改條目裡的TextView的內容)的時候不會被調用
- bindView ( ):從代碼中可以看出在繪製Item之前一定會調用bindView方法它在重繪的時候也同樣被調用
繼承CursorAdapter的樣本部分代碼:
@Override public View newView(Context context, Cursor cursor, ViewGroup parent) { ViewHolder viewHolder= new ViewHolder(); LayoutInflater inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE ); View view=inflater.inflate(R.layout.item_contacts ,parent,false); viewHolder. tv_name=(TextView) view.findViewById(R.id.tv_showusername ); viewHolder. tv_phonenumber=(TextView) view.findViewById(R.id.tv_showusernumber ); view.setTag(viewHolder); Log. i("cursor" ,"newView=" +view); return view; } @Override public void bindView(View view, Context context, Cursor cursor) { Log. i("cursor" ,"bindView=" +view); ViewHolder viewHolder=(ViewHolder) view.getTag(); //從資料庫中查詢姓名欄位 String name=cursor.getString(cursor.getColumnIndex(PersonInfo.NAME)); //從資料庫中查詢電話欄位 String phoneNumber=cursor.getString(cursor.getColumnIndex(PersonInfo.PHONENUMBER)); viewHolder. tv_name.setText(name); viewHolder. tv_phonenumber.setText(phoneNumber); }
缺點:
- 直接把Cursor暴露在UI層,寫了很多
cursor.getString(cursor.getColumnIndex("scheme"))類似的代碼.直接把Cursor暴露在ui層是很不好的示範,Cursor是非常底層的資料模型,不應該暴露在ui層。
- SQLite 載入超過1M資料速度會變得很慢.一旦資料量大了整個UI的速度立刻降了下來。
- RecyclerView 並不支援 CursorAdapter
總之,CursorAdapter這種方式並不是很好的設計典範。
Android CursorAdapter的使用