当我通过ListView点击复选框(或选择项目)时,我遇到了一个奇怪的错误。
由于我的自定义基本适配器,我想在每次选中复选框时执行setItemChecked()。
第一次点击什么都不做(看起来没有点击),但是我检查了onclick()是否被触发了它确实没有。所以它看起来没有点击。
第二次点击显然也是第三次点击。
然后它重新启动,下一次点击不会改变复选框的外观。
此外,如果我点击其中一个“点击阶段”中的其他复选框,则复选框的行为将不会像他们应该那样。
以下是我的BaseAdapter类的重要摘录,其中包含以下功能:
final int finalPosition = position;
checkbox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
if (((CheckBox) arg0).isChecked()) {
((ListView)parent).setItemChecked(finalPosition, true);
} else {
((ListView)parent).setItemChecked(finalPosition, false);
}
}
});
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
checkbox.toggle();
if (checkbox.isChecked()) {
((ListView)parent).setItemChecked(finalPosition, true);
} else {
((ListView)parent).setItemChecked(finalPosition, false);
}
}
});
这就是全班:
public class ShoppingListBaseAdapter extends BaseAdapter {
private ArrayList<ShoppingListEntry> m_itemList;
private Context m_context;
private LayoutInflater m_inflater;
public ShoppingListBaseAdapter(Context context, ArrayList<ShoppingListEntry> shoppingListEntryArrayList) {
m_itemList = shoppingListEntryArrayList;
m_context = context;
m_inflater = (LayoutInflater.from(context));
}
@Override
public int getCount() {
return m_itemList.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, final ViewGroup parent) {
convertView = m_inflater.inflate(R.layout.list_row, null);
TextView title = (TextView) convertView.findViewById(R.id.txt_title);
TextView info = (TextView) convertView.findViewById(R.id.txt_info);
final CheckBox checkbox = (CheckBox) convertView.findViewById(R.id.checkbox1);
String itemTitle;
String productBrand = m_itemList.get(position).getProductBrand().toString();
if ( !productBrand.isEmpty() ) {
itemTitle = productBrand + " " + m_itemList.get(position).getProductName().toString();
} else {
itemTitle = m_itemList.get(position).getProductName().toString();
}
title.setText(itemTitle);
String itemInfo;
String productAmount = m_itemList.get(position).getProductAmount();
float productPrice = m_itemList.get(position).getProductPrice();
itemInfo = productAmount + ", " + productPrice + "€";
info.setText(itemInfo);
final int finalPosition = position;
checkbox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
if (((CheckBox) arg0).isChecked()) {
((ListView)parent).setItemChecked(finalPosition, true);
} else {
((ListView)parent).setItemChecked(finalPosition, false);
}
}
});
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
checkbox.toggle();
if (checkbox.isChecked()) {
((ListView)parent).setItemChecked(finalPosition, true);
} else {
((ListView)parent).setItemChecked(finalPosition, false);
}
}
});
return convertView;
}
我做错了什么?
答案 0 :(得分:1)
使用setOnCheckChange
而不是这样:
checkbox.setOnCheckedChangeListener.setOnCheckedChangeListener(null);
//if true, your checkbox will be selected, else unselected
checkbox.setOnCheckedChangeListener.setChecked(item.isSelected());
checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
});
这样当你想要设置它的状态(被检查或不被检查)时你的监听器就不会调用,然后通过改变它的状态来调用它, 只是测试一下,让我知道结果