(android實戰)自訂CursorAdapter,實現ListView中動態載入button,和點擊事件

來源:互聯網
上載者:User

前言:

       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中包含了setTaggetTag 一對方法,同過這樣的方法可以在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);
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.