Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.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 列表项中有多个复选框_Android_Checkbox_Android Listview - Fatal编程技术网

Android 列表项中有多个复选框

Android 列表项中有多个复选框,android,checkbox,android-listview,Android,Checkbox,Android Listview,我正在尝试构建一个自定义阵列适配器,该适配器在每个列表项中有两个复选框。单击某个复选框时,如果选中了另一个复选框,我希望取消选中该复选框。因此,要么两个复选框都未选中,要么只有一个复选框未选中 我想我遇到的问题是,我不清楚如何从onClickListener内部引用另一个复选框。以下是我迄今为止的代码: public class PetWalkerAdapter extends ArrayAdapter<ParseObject>{ protected Context mCon

我正在尝试构建一个自定义阵列适配器,该适配器在每个列表项中有两个复选框。单击某个复选框时,如果选中了另一个复选框,我希望取消选中该复选框。因此,要么两个复选框都未选中,要么只有一个复选框未选中

我想我遇到的问题是,我不清楚如何从onClickListener内部引用另一个复选框。以下是我迄今为止的代码:

public class PetWalkerAdapter extends ArrayAdapter<ParseObject>{
    protected Context mContext;
    protected List<ParseObject> mPets;

    public PetWalkerAdapter(Context context, List<ParseObject> pets) {
        super(context, R.layout.pet_walker_item, pets);
        mContext = context;
        mPets = pets;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;

        if (convertView ==  null) {
            convertView = LayoutInflater.from(mContext).inflate(R.layout.pet_walker_item, null);
            holder = new ViewHolder();
            holder.petPictureView = (ImageView) convertView.findViewById(R.id.petPicture);
            holder.petNameLabel = (TextView) convertView.findViewById(R.id.petNameLabel);
            holder.ownerCheckBox = (CheckBox) convertView.findViewById(R.id.ownerCheckBox);
            holder.walkerCheckBox = (CheckBox) convertView.findViewById(R.id.walkerCheckBox);
            convertView.setTag(holder);

            // If owner check is toggled, uncheck walker
            holder.ownerCheckBox.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    CheckBox cb = (CheckBox) view;
                    ViewHolder petHolder = (ViewHolder) cb.getTag();

                    // Here's where the app crashes, 
                    if (petHolder.walkerCheckBox.isChecked()) {
                        petHolder.walkerCheckBox.setChecked(false);
                    }
                }
            });

        }
        else {
            holder = (ViewHolder)convertView.getTag();
        }

        ParseObject pet = mPets.get(position);

        holder.petNameLabel.setText(pet.getString(ParseConstants.KEY_PET_NAME));



        return convertView;
    }

    private static class ViewHolder {
        ImageView petPictureView;
        TextView petNameLabel;
        CheckBox ownerCheckBox;
        CheckBox walkerCheckBox;
    }

    public void refill(List<ParseObject> pets) {
        mPets.clear();
        mPets.addAll(pets);
        notifyDataSetChanged();
    }
}

如果你需要更多的信息,请告诉我。任何评论或参考都将不胜感激。感谢您的查看。

看起来您正在尝试为行视图设置标记,然后尝试检索复选框。您应该这样做:
更新。就像我说的,我没有彻底检查代码,你所要做的就是做一个小小的修改

@Override
 public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;

    if (convertView ==  null) {
        convertView = LayoutInflater.from(mContext).inflate(R.layout.pet_walker_item, null);
        holder = new ViewHolder();
        holder.petPictureView = (ImageView) convertView.findViewById(R.id.petPicture);
        holder.petNameLabel = (TextView) convertView.findViewById(R.id.petNameLabel);
        holder.ownerCheckBox = (CheckBox) convertView.findViewById(R.id.ownerCheckBox);
        holder.walkerCheckBox = (CheckBox) convertView.findViewById(R.id.walkerCheckBox);
        convertView.setTag(holder);

    }
    else {
        holder = (ViewHolder)convertView.getTag();
    }

    setClickListeners(convertView);   

    ParseObject pet = mPets.get(position);
    holder.petNameLabel.setText(pet.getString(ParseConstants.KEY_PET_NAME));
    return convertView;
}

private void setClickListeners(final View convertView)
{
   ViewHolder petHolder = (ViewHolder) convertView.getTag();
   // If owner check is toggled, uncheck walker
   petHolder.ownerCheckBox.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
              //CheckBox cb = (CheckBox) view;//Wrong

              //Do a check here.
              if(petHolder==null)
              {
                 //or other thing that doesn't lead to a crash.
                 return;
              }       
              // Here's where the app crashes, 
              //here u can do better - like setting different than it was.//
              //not sure if I got what you were trying to do in the next lines.
              petHolder.walkerCheckBox.setChecked(!petHolder.walkerCheckBox.isChecked());
              //the next lines look weird.
              CheckBox wcb = petHolder.walkerCheckBox;
              wcb.setChecked(false);
              if (petHolder.walkerCheckBox.isChecked()) {
                   petHolder.walkerCheckBox.setChecked(false);
              }
        }
    }); 
}
注意上面的代码没有经过测试,所以复制粘贴可能无法工作。这些是我根据你的代码观察到的
要更好地了解支架模式,请查看此处。

请为这次崩溃设置日志。你考虑过单选按钮吗?@AndrewMedico我没有考虑单选按钮,我的目标是循环浏览列表,看看用户在点击另一个片段中的保存按钮时选中了哪个选项(如果有的话)。如果我不能工作,我可以考虑修改,谢谢你的建议!谢谢你的回复。我删掉了一行可能让人困惑的文字。我在调试时不小心把它忘在里面了。这段代码的问题与我之前尝试直接引用复选框时遇到的问题相同。当我在onClick方法中引用
convertView
时,我得到一个错误,说
变量convertView是从内部类中访问的,需要声明为final
感谢您的支持,这是我的第一个应用程序。这个解决方案只做了一个小的添加:在
setClickListeners()
方法中,我需要添加
ViewHolder=(ViewHolder)convertView.getTag()
,然后再执行其他操作。另外,我完全删除了看起来很奇怪的行,并将
petHolder.walkerCheckBox.setChecked(!petHolder.walkerCheckBox.isChecked())
更改为
petHolder.walkerCheckBox.setChecked(!petHolder.ownerCheckBox.isChecked())
。是的,你说得对。就像我说的,我没有检查每一个小细节。一般来说,该系统工作非常简单。首先,在前6-7个视图中显示一个数据列表。初始化此视图后,如果您决定查看更多视图,则向下滚动时,您所做的就是重用这些视图。在视图保持架中,您只需存储需要为每个视图重用的数据。
@Override
 public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;

    if (convertView ==  null) {
        convertView = LayoutInflater.from(mContext).inflate(R.layout.pet_walker_item, null);
        holder = new ViewHolder();
        holder.petPictureView = (ImageView) convertView.findViewById(R.id.petPicture);
        holder.petNameLabel = (TextView) convertView.findViewById(R.id.petNameLabel);
        holder.ownerCheckBox = (CheckBox) convertView.findViewById(R.id.ownerCheckBox);
        holder.walkerCheckBox = (CheckBox) convertView.findViewById(R.id.walkerCheckBox);
        convertView.setTag(holder);

    }
    else {
        holder = (ViewHolder)convertView.getTag();
    }

    setClickListeners(convertView);   

    ParseObject pet = mPets.get(position);
    holder.petNameLabel.setText(pet.getString(ParseConstants.KEY_PET_NAME));
    return convertView;
}

private void setClickListeners(final View convertView)
{
   ViewHolder petHolder = (ViewHolder) convertView.getTag();
   // If owner check is toggled, uncheck walker
   petHolder.ownerCheckBox.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
              //CheckBox cb = (CheckBox) view;//Wrong

              //Do a check here.
              if(petHolder==null)
              {
                 //or other thing that doesn't lead to a crash.
                 return;
              }       
              // Here's where the app crashes, 
              //here u can do better - like setting different than it was.//
              //not sure if I got what you were trying to do in the next lines.
              petHolder.walkerCheckBox.setChecked(!petHolder.walkerCheckBox.isChecked());
              //the next lines look weird.
              CheckBox wcb = petHolder.walkerCheckBox;
              wcb.setChecked(false);
              if (petHolder.walkerCheckBox.isChecked()) {
                   petHolder.walkerCheckBox.setChecked(false);
              }
        }
    }); 
}