(android实战)自定义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)
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);
