自定义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中包含了setTag 和getTag 一对方法,同过这样的方法可以在View’绑定时,把Item中的唯一标识 保存到Button的Tag中,并在Button的点击事件中读取标识。
3 源码实现(注:点击按钮用的ImageView代替的 ,实现原理是一样的)
3.1 界面定义(ListItem)
<?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); |