您的位置:首页 > 移动开发 > Android开发

listview中的radiobutton实现单选的两种方式而且可以控制另一控件button的是否可见

2016-03-29 23:27 441 查看
项目需要,listview中,每行有radioButton和textview,button等控件,实现单选且选中的那一行显示button控件。话不多说,看关键代码,注释详细

方法一:利用map记录控件的状态

public class AppGongDan_map extends Activity {

private ListView listView;
private List<String[]> arrlist;
private MyAdapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);

initData();
setContentView(R.layout.gongdan);
listView = (ListView) findViewById(R.id.lv_appgongdan);
adapter = new MyAdapter(AppGongDan_map.this, arrlist);
listView.setAdapter(adapter);

}

private void initData() {
// TODO Auto-generated method stub

arrlist = new ArrayList<String[]>();

//for
for(int i=0; i< 28; i++){
String shName = "商户名称"+i;
String clientName = "姓名"+i;
String gender = null;
if(i%2 ==0){
gender = "男";
}else{
gender = "女";
}
String time = "时间"+i;
String[] str = {shName, clientName, gender, time};
arrlist.add(str);
}

}

class MyAdapter extends BaseAdapter {

private int temp = -1;

Activity activity;
List<String[]> list = new ArrayList<String[]>();;
private Map<String,Boolean> statusMap = new HashMap<String,Boolean>(); //记录radioButton的状态
private Map<String,Boolean> visiableMap = new HashMap<String,Boolean>();;//记录Button的状态
public MyAdapter(Activity context, List list) {
this.activity = context;
this.list = list;

}

@Override
public int getCount() {
// TODO Auto-generated method stub
if (list != null & list.size() > 0) {
return list.size();
}
return 0;
}

@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return list.get(position);
}

@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}

@Override
public View getView(final int position, View convertView,
ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder holder = null;
if (convertView == null) {

holder =  new ViewHolder();
convertView = LayoutInflater.from(AppGongDan_map.this).inflate(
R.layout.appgongdan_item, null);

holder.radioButton = (RadioButton) convertView
.findViewById(R.id.appgd_checkbox);
holder.tv_clientName = (TextView) convertView
.findViewById(R.id.appgd_clientname);
holder.tv_shName = (TextView) convertView
.findViewById(R.id.appgd_shname);
holder.tv_gender = (TextView) convertView
.findViewById(R.id.appgd_gender);
holder.tv_time = (TextView) convertView
.findViewById(R.id.appgd_date);
holder.btn_del = (Button) convertView
.findViewById(R.id.appgd_btn_select);
holder.radioButton.setChecked(false);

convertView.setTag(holder);

} else {

holder = (ViewHolder) convertView.getTag();

}

holder.tv_shName.setText(((list.get(position))[0]));

holder.tv_clientName.setText(list.get(position)[1]);

holder.tv_gender.setText(list.get(position)[2]);

holder.tv_time.setText(list.get(position)[3]);

holder.radioButton
.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
// TODO Auto-generated method stub
if (isChecked) {

for(String key : statusMap.keySet()){
statusMap.put(key, false);
visiableMap.put(key, false);
 
}
statusMap.put(""+position, true);
visiableMap.put(""+position, true);
MyAdapter.this.notifyDataSetChanged(); //更新listview

}
}
});
//radiobutton是否选中状态
Boolean res = false;
if(statusMap.get(""+position) == null || statusMap.get(""+position) == false){
res = false;
statusMap.put(""+position, res);
}else{
res = true;
}
holder.radioButton.setChecked(res);

//设置button的可见性
int visiable = View.INVISIBLE;
if(visiableMap.get(""+position) == null || visiableMap.get(""+position) == false){
visiable = View.INVISIBLE;
visiableMap.put(""+position, false);
}else{
visiable = View.VISIBLE;
}
holder.btn_del.setVisibility(visiable);

holder.btn_del.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String btn_info = "商户名称:" + list.get(position)[0] + "客户姓名"
+ list.get(position)[1];
Toast.makeText(AppGongDan_map.this, btn_info, 1).show();
//radiobtn.setChecked(false);
list.remove(position);
adapter = new MyAdapter(AppGongDan_map.this, list);
listView.setAdapter(adapter);
//adapter.notifyDataSetChanged(); 
}
});
return convertView;
}

}

private class ViewHolder {

TextView tv_shName;
TextView tv_clientName;
TextView tv_gender;
TextView tv_time;
Button btn_del;
RadioButton radioButton;
}

}

方法二:setId()

public class AppGongDan extends Activity {

private ListView listView;
private List<String[]> arrlist;
private MyAdapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);

initData();
setContentView(R.layout.gongdan);
listView = (ListView) findViewById(R.id.lv_appgongdan);
adapter = new MyAdapter(AppGongDan.this, arrlist);
listView.setAdapter(adapter);

}

private void initData() {
// TODO Auto-generated method stub
arrlist = new ArrayList<String[]>();

//for
for(int i=0; i< 28; i++){
String shName = "商户名称"+i;
String clientName = "姓名"+i;
String gender = null;
if(i%2 ==0){
gender = "男";
}else{
gender = "女";
}
String time = "时间"+i;
String[] str = {shName, clientName, gender, time};
arrlist.add(str);
}
}

class MyAdapter extends BaseAdapter {

private int temp = -1;

Activity activity;
List<String[]> list = new ArrayList<String[]>();;

public MyAdapter(Activity context, List list) {
this.activity = context;
this.list = list;
}

@Override
public int getCount() {
// TODO Auto-generated method stub
if (list != null & list.size() > 0) {
return list.size();
}
return 0;
}

@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return list.get(position);
}

@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}

@Override
public View getView(final int position, View convertView,
ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder holder = null;
if (convertView == null) {

holder =  new ViewHolder();
convertView = LayoutInflater.from(AppGongDan.this).inflate(
R.layout.appgongdan_item, null);

holder.radioButton = (RadioButton) convertView
.findViewById(R.id.appgd_checkbox);
holder.tv_clientName = (TextView) convertView
.findViewById(R.id.appgd_clientname);
holder.tv_shName = (TextView) convertView
.findViewById(R.id.appgd_shname);
holder.tv_gender = (TextView) convertView
.findViewById(R.id.appgd_gender);
holder.tv_time = (TextView) convertView
.findViewById(R.id.appgd_date);
holder.btn_del = (Button) convertView
.findViewById(R.id.appgd_btn_select);
holder.radioButton.setChecked(false);

convertView.setTag(holder);

} else {

holder = (ViewHolder) convertView.getTag();

}

holder.tv_shName.setText(((list.get(position))[0]));

holder.tv_clientName.setText(list.get(position)[1]);

holder.tv_gender.setText(list.get(position)[2]);

holder.tv_time.setText(list.get(position)[3]);
final Button btn = (Button)convertView.findViewById(R.id.appgd_btn_select);//radiobutton的onCheckedChanged()方法里更改button的可见状态,许final类型
holder.radioButton.setId(position); //radiobutton设置Id
holder.radioButton
.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
// TODO Auto-generated method stub
if (isChecked) {
/*
* 把上次选择的取消
*/
if (temp != -1) {
RadioButton tempBtn = (RadioButton) activity
.findViewById(temp);
if (tempBtn != null) {
tempBtn.setChecked(false);
}
}
temp = buttonView.getId();
 
btn.setVisibility(View.VISIBLE);
btn.setClickable(true);
} else {
btn.setVisibility(View.INVISIBLE);
btn.setClickable(false);
}
}
});
if (temp == position) {
holder.radioButton.setChecked(true);

} else {
holder.radioButton.setChecked(false);

}

holder.btn_del.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String btn_info = "商户名称:" + list.get(position)[0] + "客户姓名"
+ list.get(position)[1];
Toast.makeText(AppGongDan.this, btn_info, 1).show();
//radiobtn.setChecked(false);
list.remove(position);
adapter = new MyAdapter(AppGongDan.this, list);
listView.setAdapter(adapter);
//adapter.notifyDataSetChanged(); //有问题,因为setId的原因
}
});
return convertView;
}

}

private class ViewHolder {

TextView tv_shName;
TextView tv_clientName;
TextView tv_gender;
TextView tv_time;
Button btn_del;
RadioButton radioButton;
}

}

亲测,没有问题
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息