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