Android 每次只选中一个复选框的自定义listview
我有一个自定义列表视图,每一行包含一个复选框和文本。现在我想要的是,如果选中listview行中的任何一个复选框,那么如果选中其他行中的其他复选框,它将被自动删除。(即一次只能选中一个复选框)。我应该如何做 到目前为止,我所做的工作如下:Android 每次只选中一个复选框的自定义listview,android,listview,checkbox,Android,Listview,Checkbox,我有一个自定义列表视图,每一行包含一个复选框和文本。现在我想要的是,如果选中listview行中的任何一个复选框,那么如果选中其他行中的其他复选框,它将被自动删除。(即一次只能选中一个复选框)。我应该如何做 到目前为止,我所做的工作如下: public class CustomAdapter extends BaseAdapter{ Context context; List<String> items; boolean array[]; p
public class CustomAdapter extends BaseAdapter{
Context context;
List<String> items;
boolean array[];
public CustomAdapter(Context context, List<String> items) {
super();
this.context = context;
this.items = items;
array =new boolean[items.size()];
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return items.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return items.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View v=convertView;
final int pos=position;
if(v==null)
{
v=LayoutInflater.from(context).inflate(R.layout.list,null);
}
TextView txt1=(TextView) v.findViewById(R.id.textView1);
final CheckBox chkbox=(CheckBox) v.findViewById(R.id.checkBox1);
txt1.setText(items.get(position));
int selectedindexitem=0;
chkbox.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(chkbox.isChecked())
{
array[pos]=true;
}else{
array[pos]=false;
}
}
});
chkbox.setChecked(array[pos]);
return v;
}
}
In this code i can select multiple checkbox at a time but i need only one checkbox should be checked one at a time.
公共类CustomAdapter扩展了BaseAdapter{
语境;
清单项目;
布尔数组[];
公共CustomAdapter(上下文、列表项){
超级();
this.context=上下文;
这个项目=项目;
数组=新布尔值[items.size()];
}
@凌驾
public int getCount(){
//TODO自动生成的方法存根
返回items.size();
}
@凌驾
公共对象getItem(int位置){
//TODO自动生成的方法存根
返回项目。获取(位置);
}
@凌驾
公共长getItemId(int位置){
//TODO自动生成的方法存根
返回位置;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
//TODO自动生成的方法存根
视图v=转换视图;
最终int pos=位置;
如果(v==null)
{
v=布局更平坦。从(上下文)。膨胀(R.layout.list,空);
}
TextView txt1=(TextView)v.findViewById(R.id.textView1);
最终复选框chkbox=(复选框)v.findviewbyd(R.id.checkBox1);
txt1.setText(items.get(position));
int selectedindexitem=0;
setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
//TODO自动生成的方法存根
if(chkbox.isChecked())
{
数组[pos]=true;
}否则{
数组[pos]=false;
}
}
});
chkbox.setChecked(数组[pos]);
返回v;
}
}
在这段代码中,我可以一次选中多个复选框,但我只需要一个复选框,一次选中一个。
维护一个变量:
int checked = -1; //say
每当您尝试勾选复选框时,请勾选此变量,如果它为-1,则勾选复选框并将列表项的位置保存在已勾选变量中;当您再次尝试勾选其他复选框时,如果变量不等于-1,则先取消勾选存储在已勾选变量中位置的复选框,然后选中当前位置的复选框并将当前位置保存在选中变量中您需要跟踪所选项目并相应地编码
public class CustomAdapter extends BaseAdapter{
Integer selected_position = -1;
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// Your Code
chkbox.setChecked(position==selected_position);
chkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked)
{
selected_position = position;
}
else{
selected_position = -1;
}
notifyDataSetChanged();
}
});
return convertView;
}
}
尝试更改所有项布尔值false在通知适配器后排除选定项,并实现ListView性能的设计模式:
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView==null){
holder = new ViewHolder();
convertView = LayoutInflater.from(context).inflate(R.layout.list,null);
holder.txt1 = (TextView) convertView.findViewById(R.id.textView1);
holder.chkbox = (CheckBox) convertView.findViewById(R.id.checkBox1);
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
}
holder.txt1.setText(items.get(position));
holder.chkbox.setChecked(array[position]);
holder.chkbox.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
for (int i=0;i<array.length;i++){
if(i==position){
array[i]=true;
}else{
array[i]=false;
}
}
notifyDataSetChanged();
}
});
return convertView;
}
class ViewHolder{
TextView txt1;
CheckBox chkbox;
}
@覆盖
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
视窗座;
if(convertView==null){
holder=新的ViewHolder();
convertView=LayoutInflater.from(context).inflate(R.layout.list,null);
holder.txt1=(TextView)convertView.findViewById(R.id.textView1);
holder.chkbox=(复选框)convertView.findViewById(R.id.checkBox1);
convertView.setTag(支架);
}否则{
holder=(ViewHolder)convertView.getTag();
}
holder.txt1.setText(items.get(position));
holder.chkbox.setChecked(数组[位置]);
holder.chkbox.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
对于(int i=0;i易于维护您的选择。从模型中获取您的选择
class PropertyModel{
String VAL= "SOME VALUE"
boolean selected = false;
public String getVAL() {return VAL;}
public void setVAL(String VAL) {this.VAL = VAL;}
public boolean isSelected() {return selected;}
public void setSelected(boolean selected) {this.selected = selected;}
}
按以下方式准备您的视图:
public class CheckBoxAdptr extends BaseAdapter{
/*
..........
*/
public View getView(int position, View view, ViewGroup parent) {
PropertyModel items = list.get(position);
View row;
if (view == null) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.list_item_checkbox, null);
}
else{row = view;}
TextView T1 = (TextView) row.findViewById(R.id.list_item_1);
CheckBox checkBox = (CheckBox) row.findViewById(R.id.list_item_check_box);
T1.setText(""+items.getVAL());
if(items.isSelected()){
checkBox.setChecked(true);
}
else {checkBox.setChecked(false);}
return row;
}
}
final ArrayList<PropertyModel> list = getList();
CheckBoxAdptr adpt = new CheckBoxAdptr(getActivity(), list);
listview.setAdapter(adpt);
listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
for(int i = 0; i<list.size(); i++){
if(i!=position){
list.get(i).setSelected(false);
}
else{
list.get(i).setSelected(true);
}
}
adpt.notifyDataSetChanged();
}
});
现在,在活动或片段中设置适配器并执行以下操作:
public class CheckBoxAdptr extends BaseAdapter{
/*
..........
*/
public View getView(int position, View view, ViewGroup parent) {
PropertyModel items = list.get(position);
View row;
if (view == null) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.list_item_checkbox, null);
}
else{row = view;}
TextView T1 = (TextView) row.findViewById(R.id.list_item_1);
CheckBox checkBox = (CheckBox) row.findViewById(R.id.list_item_check_box);
T1.setText(""+items.getVAL());
if(items.isSelected()){
checkBox.setChecked(true);
}
else {checkBox.setChecked(false);}
return row;
}
}
final ArrayList<PropertyModel> list = getList();
CheckBoxAdptr adpt = new CheckBoxAdptr(getActivity(), list);
listview.setAdapter(adpt);
listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
for(int i = 0; i<list.size(); i++){
if(i!=position){
list.get(i).setSelected(false);
}
else{
list.get(i).setSelected(true);
}
}
adpt.notifyDataSetChanged();
}
});
final ArrayList list=getList();
CheckBoxAdptr adpt=新的CheckBoxAdptr(getActivity(),list);
setAdapter(adpt);
setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView AdapterView,视图视图,整型位置,长id){
for(int i=0;i使用getView(与发布的大多数答案一样)对我来说工作不正常。它的响应不够。有时它会取消选中前面的复选框,有时则不会
这对我来说非常有效:
首先,我们需要存储所有先前选中复选框的位置:
Set<Integer> selectedPreviousPositions = new HashSet<>();
Set selectedPreviousPositions=new HashSet();
然后在onItemClick listener中,我们取消选中所有复选框,然后再选中所选的复选框
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
boolean isChecked = ((CheckBox) view.findViewById(R.id.cbSelected)).isChecked();
if (!isChecked) {
final ListView listDevices = (ListView) findViewById(R.id.lvDevices);
for (Integer pos : selectedPreviousPositions ) {
View pView = listDevices.getChildAt(pos);
if (pView != null) { // unnecessary but we never know !
((CheckBox)pView.findViewById(R.id.checkboxID)).setChecked(false);
}
}
selectedUniquePositions.add(new Integer(position));
// Now we can check the selected checkbox
((CheckBox) view.findViewById(R.id.cbSelected)).setChecked(true);
} else {
((CheckBox) view.findViewById(R.id.cbSelected)).setChecked(false);
selectedPreviousPositions.remove(new Integer(position));
}
}
@覆盖
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
布尔值isChecked=((复选框)view.findviewbyd(R.id.cbSelected)).isChecked();
如果(!已检查){
最终ListView listDevices=(ListView)findViewById(R.id.lvDevices);
用于(整数位置:selectedPreviousPositions){
View pView=listDevices.getChildAt(pos);
如果(pView!=null){//不必要,但我们永远不知道!
((复选框)pView.findviewbyd(R.id.checkboxID)).setChecked(false);
}
}
选择多个整数位置。添加(新整数(位置));
//现在我们可以选中选中的复选框
((复选框)view.findviewbyd(R.id.cbSelected)).setChecked(true);
}否则{
((复选框)view.findviewbyd(R.id.cbSelected)).setChecked(false);
selectedPreviousPositions.删除(新整数(位置));
}
}
在适配器内部,为复选框设置OnClickListener()。每当单击复选框时,存储单击的复选框位置并调用notifyDataSetChanged()。这将为listview中的所有视图再次调用getView()方法。每当调用getView()时,您都会选中以前存储的位置和unc的复选框