我正在使用ListView
开发Android应用程序。此ListView
中的每个项目都会有checkbox
。
我试图在用户点击其中一个项目时取消选中每个项目。例如。 ListView
有两个项目, 0,1 。
此时选择0并且用户点击第1项。我想取消选择第0项。
这是我的代码。它在ArrayAdapter
内。
@Override
public View getView(final int position, View convertView, ViewGroup parent)
{
View row = convertView;
if (row == null)
{
LayoutInflater inflater = ((Activity)context).getLayoutInflater();
row = inflater.inflate(itemLayoutId, parent, false);
}
Gate gate = gates.get(position);
if (gate != null)
{
TextView itemText = (TextView)row.findViewById(R.id.gateNameText);
if (itemText != null)
itemText.setText(gate.getName());
ImageView imageView =
(ImageView)row.findViewById(R.id.gateTypeImage);
int resId;
switch (gate.getSelTypeOperation())
{
case 0:
resId = R.drawable.garage;
break;
case 1:
resId = R.drawable.pulse;
break;
case 2:
resId = R.drawable.onoff;
break;
default:
resId = R.drawable.garage;
break;
}
imageView.setImageResource(resId);
CheckBox checkBox =
(CheckBox)row.findViewById(R.id.gateSelectedCheck);
if (checkBox != null)
{
checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener()
{
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked)
{
// Solo hago algo si el nuevo estado es marcado.
if (isChecked)
for(int i = 0; i < gates.size(); i++)
{
if (i != position)
{
Log.v("GatesAdapter", "uncheck: " + position);
View view = getView(i, null, null);
CheckBox checkBox =
(CheckBox)view.findViewById(R.id.gateSelectedCheck);
checkBox.setChecked(false);
}
}
}
});
checkBox.setChecked(selectedGateIndex == position);
}
}
return row;
}
但是,它不起作用。
我做错了什么?
答案 0 :(得分:1)
您需要使用listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE),并且您需要使自定义视图的行实现可检查。 。另一个SO问题 - 解决问题是here
答案 1 :(得分:1)
只需更改您的getview()
方法,如下所示:
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View vi = convertView;
final Holder holder;
if (vi == null) {
vi = inflater.inflate(R.layout.raw_customelabel_list, null);
holder = new Holder();
holder.txtname = (TextView) vi
.findViewById(R.id.raw_customlabel_txt_name);
holder.checkbox = (CheckBox) vi
.findViewById(R.id.raw_customlabel_checkbox);
vi.setTag(holder);
} else {
holder = (Holder) vi.getTag();
}
vi.setTag(holder);
holder.txtname.setText(strarry[position]);
holder.checkbox.setId(position);
holder.checkbox.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
for (int i = 0; i < strarry.length; i++) {
if (v.getId() == i) {
checkarry[i] = true;
Log.v("check", ""+position);
} else {
checkarry[i] = false;
}
}
notifyDataSetChanged();
}
});
if (checkarry[position]) {
holder.checkbox.setChecked(true);
} else {
holder.checkbox.setChecked(false);
}
return vi;
}
}
答案 2 :(得分:1)
使用以下代码,它可以正常使用
int selected_position =-1
public View getView(final int position, View convertView, ViewGroup parent)
{
if(selected_position==position)
{
CHECKBOX.setChecked(true);
}
else
{
CHECKBOX.setChecked(false);
}
CHECKBOX.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (((CheckBox) view).isChecked())
{
selected_position= position;
}
else
{
selected_position=-1;
}
notifyDataSetChanged();
}
});
return view;
}
}
答案 3 :(得分:0)
使用单选按钮。如果我看到复选框,我想我可以选择尽可能多的复选框。
如果您只是在代码中用RadioButton替换CheckBox对象,是不是解决了您的问题?