单击 android 中的复选框
Clicking check boxes in android
我正在实现带有 40 个动态复选框的列表视图。问题是,当我单击 1 个复选框时,其他几个复选框也会被选中,例如,如果我单击单个复选框,那么它也会使其他几个复选框被选中。我为此使用 onClickListener。下面给出了我的代码片段之一:
public View getView(final int position, View convertView,ViewGroup parent) {
View row=convertView;
FilterViewHolder holder;
if (row==null) {
LayoutInflater inflater=getLayoutInflater();
row=inflater.inflate(R.layout.filterlist_row, parent, false);
holder = new FilterViewHolder();
holder.filterCheckBox = (CheckBox)row.findViewById(R.id.filter_checkbox);
holder.filterCheckBox.setTypeface(fontFace);
row.setTag(holder);
} else {
//holder = (View) row;
holder = (FilterViewHolder) row.getTag();
/* When a listview recycles views , it recycles its present state as well as listeners attached to it.
* if the checkbox was checked and has a onCheckedChangeListener set, both will remain a part of
* recycled view based on position. So it is our responsibility to reset all states and remove
* previous listeners.
* The listener was removed as below:-
*/
holder.filterCheckBox.setOnCheckedChangeListener(null);
}
holder.filterCheckBox.setText(areaList.get(position));
holder.filterCheckBox.setFocusable(false);
holder.filterCheckBox.setChecked(positionArray.get(position));
holder.filterCheckBox.setText(areaList.get(position));
holder.filterCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// TODO Auto-generated method stub
if (isChecked) {
//change state of concern item in 'positionArray' array to 'True'
positionArray.set(position, true);
//add the checked item in to area list which used to filter offers.
filterOffersByThisAreaList.add(areaList.get(position));
} else {
//change state of concern item in 'positionArray' array to 'True'
positionArray.set(position, true);
//remove the unchecked item in to area list which used to filter offers.
filterOffersByThisAreaList.remove(areaList.get(position));
}
}
});
return row;
}
不要直接在 onCheckedChanged
中使用 position
来设置 CheckBox
的状态,您应该使用 setTag
和 getTag
方法来获取选中项目的位置:
...
holder.filterCheckBox.setTag(position);
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// TODO Auto-generated method stub
int checkPos=Integer.parseInt(buttonView.getTag().toString());
....your code here...
}
始终在返回 getView 之前调用 setChecked 并 Uncheck/check 手动调用返回项目内的复选框,这就像您正在重用通过您实现的 getView() 方法传递的 convertView。
我正在实现带有 40 个动态复选框的列表视图。问题是,当我单击 1 个复选框时,其他几个复选框也会被选中,例如,如果我单击单个复选框,那么它也会使其他几个复选框被选中。我为此使用 onClickListener。下面给出了我的代码片段之一:
public View getView(final int position, View convertView,ViewGroup parent) {
View row=convertView;
FilterViewHolder holder;
if (row==null) {
LayoutInflater inflater=getLayoutInflater();
row=inflater.inflate(R.layout.filterlist_row, parent, false);
holder = new FilterViewHolder();
holder.filterCheckBox = (CheckBox)row.findViewById(R.id.filter_checkbox);
holder.filterCheckBox.setTypeface(fontFace);
row.setTag(holder);
} else {
//holder = (View) row;
holder = (FilterViewHolder) row.getTag();
/* When a listview recycles views , it recycles its present state as well as listeners attached to it.
* if the checkbox was checked and has a onCheckedChangeListener set, both will remain a part of
* recycled view based on position. So it is our responsibility to reset all states and remove
* previous listeners.
* The listener was removed as below:-
*/
holder.filterCheckBox.setOnCheckedChangeListener(null);
}
holder.filterCheckBox.setText(areaList.get(position));
holder.filterCheckBox.setFocusable(false);
holder.filterCheckBox.setChecked(positionArray.get(position));
holder.filterCheckBox.setText(areaList.get(position));
holder.filterCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// TODO Auto-generated method stub
if (isChecked) {
//change state of concern item in 'positionArray' array to 'True'
positionArray.set(position, true);
//add the checked item in to area list which used to filter offers.
filterOffersByThisAreaList.add(areaList.get(position));
} else {
//change state of concern item in 'positionArray' array to 'True'
positionArray.set(position, true);
//remove the unchecked item in to area list which used to filter offers.
filterOffersByThisAreaList.remove(areaList.get(position));
}
}
});
return row;
}
不要直接在 onCheckedChanged
中使用 position
来设置 CheckBox
的状态,您应该使用 setTag
和 getTag
方法来获取选中项目的位置:
...
holder.filterCheckBox.setTag(position);
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// TODO Auto-generated method stub
int checkPos=Integer.parseInt(buttonView.getTag().toString());
....your code here...
}
始终在返回 getView 之前调用 setChecked 并 Uncheck/check 手动调用返回项目内的复选框,这就像您正在重用通过您实现的 getView() 方法传递的 convertView。