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

前言:

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

	}
	
	@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);
posted on 2011-07-19 18:59  一叶飘舟  阅读(7464)  评论(0编辑  收藏  举报