前言:
Android中的內建的CursorAdapter適配器可以載入固定格式的資料繫結。但在實際應用開發中,會碰到ListView中Item項顯示根據資料不同,而變化顯示。
舉例:在我們實際開發中碰到這樣的問題
根據一個主題答題情況,顯示不同的按鈕,且點擊按鈕後,轉到各自的處理介面。
【主題狀態】第一次答題
,顯示 【開始】按鈕
事件:點擊按鈕,下載題庫,轉到答題介面
【主題狀態】答題還未結束
,顯示 【繼續】按鈕
事件:點擊按鈕,轉到答題介面
【主題狀態】全部答題完成
,顯示 【重做】按鈕
事件:點擊按鈕,清空答題痕迹,轉到答題介面,重新答題
實現的:
在這樣的情況下,原來系統內建的CursorAdapter適配器就不能滿足需求的實現。
1 自訂CursorAdapter 說明
自訂CursorAdapter 需要重寫兩個函數
1.1 public
void bindView(View view, Context context, Cursor cursor)
說明: 綁定視圖函數
View 參數:當前ListView 的Item View,在View 中包含了ListView
Item 介面元素
介面元素調用的方式為:
TextView noteData = (TextView)
view.findViewById(R.id.note_list_time);
Cursor參數:當前遊標
根據Cursor來擷取資料的方法
String ID= Cursor.getString(3)
1.2 public
View newView(Context arg0, Cursor arg1, ViewGroup arg2)
擷取ListView中的Item 介面元素的函數
一般的情況下,擴充定義好的XML介面布局檔案
return
mInflater.inflate(R.layout.note_item, arg2, false);
2 ListView中Button點擊事件的實現
ListView
中實現Item中的Button事件,在實現Button事件時,最關鍵的事情是,當前button對於的Item的唯一標識,而如何儲存這唯一標識到button中呢,
在View中包含了setTag 和getTag 一對方法,同過這樣的方法可以在View’綁定時,把Item中的唯一標識 儲存到Button的Tag中,並在Button的點擊事件中讀取標識。
3 源碼實現(註:點擊按鈕用的ImageView代替的 ,實現原理是一樣的)
3.1 介面定義(ListItem)
View Code
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content" android:id="@+id/relativeLayout1"
android:background="@drawable/cl_itemback"
android:layout_width="wrap_content">
<LinearLayout android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/linearLayout4" >
<TextView
android:layout_width="60px"
android:layout_height="wrap_content"
android:id="@+id/theme_id"
android:visibility="gone"/>
</LinearLayout>
<LinearLayout android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/linearLayout4" >
<TextView android:layout_marginLeft="10px" android:textSize="18px" android:textColor="#000000" android:text="" android:id="@+id/txt_themetitle" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
<TextView android:layout_marginLeft="10px" android:textSize="14px" android:layout_marginTop="5px" android:textColor="#000000" android:text="" android:id="@+id/txt_themedescribe" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
</LinearLayout>
<LinearLayout android:gravity="center_vertical" android:orientation="vertical" android:layout_width="wrap_content" android:layout_marginTop="15px" android:paddingRight="10px" android:layout_height="wrap_content" android:id="@+id/linearLayout4" android:layout_alignParentRight="true" >
<ImageView android:src="@drawable/cl_begin" android:id="@+id/imgv_exbut" android:layout_height="wrap_content" android:layout_width="wrap_content"></ImageView>
</LinearLayout>
</RelativeLayout>
3.2 自訂CursorAdapter
/* */public class CursorAdapter_ExecuteTheme extends CursorAdapter {private LayoutInflater mInflater;private Context mContext;TextView theme_id;public CursorAdapter_ExecuteTheme(Context context, Cursor c) {super(context, c);mContext = context;mInflater = LayoutInflater.from(context);}@Overridepublic void bindView(View view, Context context, Cursor cursor) { theme_id = (TextView) view.findViewById(R.id.theme_id);TextView txt_themetitle = (TextView) view.findViewById(R.id.txt_themetitle);TextView txt_themedescribe=(TextView) view.findViewById(R.id.txt_themedescribe);ImageView img_exbut=(ImageView)view.findViewById(R.id.imgv_exbut);theme_id.setText(cursor.getString(0));txt_themetitle.setText(cursor.getString(2));////pk as _id,catalogFK,Name,3GuessCount,4State,5CurIndex,Describe from CLThemetxt_themedescribe.setText("已做("+cursor.getString(5)+")全部("+cursor.getString(3) +")");int state=cursor.getInt(4);img_exbut.setTag(cursor.getString(0));if((state==ProjectConstant.ThemeState_BEGGING)||(state==ProjectConstant.ThemeState_NONE))//主題開始{if(state==ProjectConstant.ThemeState_BEGGING)img_exbut.setImageResource(R.drawable.cl_goon);img_exbut.setOnClickListener(new ImageView.OnClickListener() { public void onClick(View v){ SoundManager.Instance.playSound("SOUND_WELCOME"); String id=v.getTag().toString(); //擷取當前主題狀態 //建立當前測試商務邏輯並載入選擇的主題資料 ExerciseBussiness.SelectTheme(id,ProjectConstant.ThemeType_Classic ,mContext); Intent i = new Intent((Activity)mContext,ExerciseGuess.class); i.putExtra("themefk",id); mContext.startActivity(i); ((Activity)mContext).finish(); } });}else if(state==ProjectConstant.ThemeState_END)//重新做{img_exbut.setImageResource(R.drawable.cl_redo);img_exbut.setOnClickListener(new ImageView.OnClickListener() { public void onClick(View v){ SoundManager.Instance.playSound("SOUND_WELCOME"); String id=v.getTag().toString(); ExerciseBussiness.ReDoTheme(id ,mContext); //重新做題 Intent i = new Intent((Activity)mContext,ExerciseGuess.class); i.putExtra("themefk",id); mContext.startActivity(i); ((Activity)mContext).finish(); } });}}@Overridepublic View newView(Context arg0, Cursor arg1, ViewGroup arg2) {return mInflater.inflate(R.layout.sub_extheme_item, arg2, false);} }
3.3 介面後台調用
ListView ectheme_list =(ListView)findViewById(R.id.ectheme_list); ThemeCatalogDataReadHelper model= new ThemeCatalogDataReadHelper(this); Cursor cursor =model.GetEcList(this.getIntent().getStringExtra("catalogpk")); CursorAdapter_ExecuteTheme adapter=new CursorAdapter_ExecuteTheme(this,cursor); ectheme_list.setAdapter(adapter);