列表视图中的复选框onclick()错误

时间:2017-06-19 19:22:19

标签: java android checkbox onclick

当我通过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;
}

我做错了什么?

1 个答案:

答案 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) {

            });

这样当你想要设置它的状态(被检查或不被检查)时你的监听器就不会调用,然后通过改变它的状态来调用它, 只是测试一下,让我知道结果