自定义CursorAdapter,实现ListView中动态加载button,和点击事件

前言:

       Android中的自带的CursorAdapter适配器可以加载固定格式的数据绑定。但在实际应用开发中,会碰到ListView中Item项显示根据数据不同,而变化显示。

举例:在我们实际开发中碰到这样的问题

      根据一个主题答题情况,显示不同的按钮,且点击按钮后,转到各自的处理界面。

   【主题状态】第一次答题,显示 【开始】按钮  

                   事件:点击按钮,下载题库,转到答题界面

   【主题状态】答题还未结束,显示 【继续】按钮  

                  事件:点击按钮,转到答题界面

    【主题状态】全部答题完成,显示 【重做】按钮  

                事件:点击按钮,清空答题痕迹,转到答题界面,重新答题

   实现的效果图:

                自定义CursorAdapter,实现ListView中动态加载button,和点击事件

在这样的情况下,原来系统自带的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);



	}

	

	@Override

	public 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 CLTheme

		txt_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();

				 }

				 

		    });

		}

	}

	

	@Override

	public 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);

你可能感兴趣的:(ListView)