【目标】
实现列表的单项选择
【方案】
在ListView中添加RadioButton。
【存在的问题】
若设置RadioButton为可点击时,会屏蔽ListView的itemClick。
各个RadioButton互相没有关联,可以都把它们选中却无法取消。
【我的解决办法】
取消ListView 的onItemClickListener()
使用RadioButton的onClickListener()
新建一个变量,记录每次被点击的position
getView的时候只让变量记录的RadioButton被选中
通过handler将选中的值传到activity中
【缺点】
必须点击RadioButton才行
点击listView的item没有响应
可操作的面积变小
【代码】
下面是adapter类
package com.example.model;
import java.util.List;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.RadioButton;
import com.example.haveimgfun.R;
public class NumRecAdapter extends ArrayAdapter{
private int resourceId;
private Handler myHandler;
//被选择的checkedButton序号
int checkedPos;
public NumRecAdapter(Context context, int resource, List objects, Handler handler) {
super(context, resource, objects);
// TODO Auto-generated constructor stub
myHandler = handler;
resourceId = resource;
}
private static class ViewHolder{
RadioButton radioButton;
int position;
}
//getView在每个子项被滚到屏幕内的时候调用
@Override
public View getView(final int position, View convertView, ViewGroup parent){
//Log.i("tag","position:"+position);
int numRecord = getItem(position).getNum();
View view; //代表每个子项
ViewHolder viewHolder;
//convertView,更新子项的布局
if(convertView == null){
//为子项加载传入的布局
view = LayoutInflater.from(getContext()).inflate(resourceId,null);
viewHolder = new ViewHolder();
viewHolder.radioButton = (RadioButton) view.findViewById(R.id.tab2_radio);
//给view添加一个额外的数据
view.setTag(viewHolder);
}else{
view = convertView;
viewHolder = (ViewHolder)view.getTag();
}
//checkedButton被点击时,设置checkedPos为当前的position
//每一个进入view的list都会设置一个监听器
//因此position为被点击的list
viewHolder.radioButton.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//Log.i("tag","clicked position:"+position);
checkedPos = position;
//将选中的消息通过handler返回给MainActivity
Message message = new Message();
message.what = position;
myHandler.sendMessage(message);
//重绘listView
notifyDataSetChanged();
}
});
viewHolder.position = position;
//更新radioButton,只用checkedPos才被选中
viewHolder.radioButton.setChecked(position == checkedPos);
//使radioButton无法点击,这样listItem才能捕获点击事件
//viewHolder.radioButton.setClickable(false);
viewHolder.radioButton.setText(String.valueOf(numRecord));
return view;
}
}