使用`performClick`时,复选框的状态未正确显示

时间:2011-06-29 13:24:03

标签: android listview checkbox

我在这里遇到了一个棘手的问题:

在我的应用程序中,有一个列表(使用ListView),每个项目包含文本和右侧对齐的复选框。 现在,单击复选框本身,我为它安装了一个处理程序(OnClickListener)并执行内部操作。复选框的可见状态与预期一样 - 第一次勾选时单击,再次单击勾号消失。

现在我只是想将可点击区域“扩展”到完整列表条目 - 我的方法是使用OnItemClickListener安装ListView.setOnItemClickListener()并在此监听器中执行以下操作:

resultView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            CheckBox checkBox = (CheckBox) view.findViewById(R.id.checkbox);
            checkBox.performClick();
        }
    });

这听起来很简单,但是有时(不是每次)复选框中的勾号都不会出现在那之后!我添加了checkBox.invalidate(),但没有帮助。

如何点击完整列表条目项的“响应”复选框??? 谢谢!

2 个答案:

答案 0 :(得分:3)

而不是使用performClick()代替使用checkBox.setChecked( !checkBox.getChecked() );performClick()将导致再次调用onClickListener,从而可能导致递归,这可以解释您所看到的奇怪行为。

答案 1 :(得分:0)

@Override
    public void onItemClick(AdapterView<?> arg0, View v, int position, long arg3) {
        // TODO Auto-generated method stub
        CheckBox cb = (CheckBox) v.findViewById(R.id.chkSelected);
        TextView tv = (TextView) v.findViewById(R.id.tvName);
//        pi = (PackageInfo) arg0.getItemAtPosition(position);
        cb.performClick();
        if (cb.isChecked()) {
            checkedValue.add(tv.getText().toString());
        } else if (!cb.isChecked()) {
            checkedValue.remove(tv.getText().toString());
        }
    }