Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 每次只选中一个复选框的自定义listview_Android_Listview_Checkbox - Fatal编程技术网

Android 每次只选中一个复选框的自定义listview

Android 每次只选中一个复选框的自定义listview,android,listview,checkbox,Android,Listview,Checkbox,我有一个自定义列表视图,每一行包含一个复选框和文本。现在我想要的是,如果选中listview行中的任何一个复选框,那么如果选中其他行中的其他复选框,它将被自动删除。(即一次只能选中一个复选框)。我应该如何做 到目前为止,我所做的工作如下: public class CustomAdapter extends BaseAdapter{ Context context; List<String> items; boolean array[]; p

我有一个自定义列表视图,每一行包含一个复选框和文本。现在我想要的是,如果选中listview行中的任何一个复选框,那么如果选中其他行中的其他复选框,它将被自动删除。(即一次只能选中一个复选框)。我应该如何做

到目前为止,我所做的工作如下:

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的复选框