BaseAdapter中的CheckBox自动检查

时间:2013-08-20 12:34:35

标签: android android-checkbox

我有ListView,每行包含textviewcheckbox

允许用户点击每个TextView,一旦他做了DialogBox,就会向他提出他应该选择YesNo的地方。

当他选择“否”时,需要自动勾选用户点击的CheckBox旁边的TextView

我面临的问题是,无论用户选择哪个TextBox,列表的最后CheckBox都会一直被勾选,而不是所选{{1}旁边的那个}}

调试后我注意到这种情况正在发生,因为适配器类的TextView方法在最后一行停止,因此总是选择最后一行。我尝试为每一行设置代码,这样我就可以相应地勾选getView(),但不会勾选checkbox

我很感激有关此事的任何帮助。

Checkboxes

2 个答案:

答案 0 :(得分:1)

尝试将行的复选框传递给您的点击侦听器:

@Override
public View getView(int position, View convertView, ViewGroup parent) 
{
.....
holder.text.setOnClickListener(new MyClickListener(holder.chk);
}
private class MyClickListener implements OnClickListener
{
    Checkbox checkbox = null;
    public MyClickListener(final Checkbox checkbox)
    {
         this.checkbox = checkbox;
    }
    @Override
    public void onClick(final View v) 
    {
        final AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
        builder.setTitle("Materials");
        builder.setMessage("Did you require any materials to fix this error?");
        builder.setPositiveButton("Yes", new DialogInterface.OnClickListener()
        {
            @Override
            public void onClick(DialogInterface dialog, int which)
            {
                String clickedError;            
                clickedError = holder.text.getText().toString();        

                Intent intent = new Intent(mContext, Material.class);
                intent.putStringArrayListExtra("materialList", materialList);
                intent.putExtra("clickedError", clickedError);
                intent.putExtra("repairID", repairID);
                ((Activity)mContext).startActivityForResult(intent, 1);
            }
        });
        builder.setNegativeButton("No", new DialogInterface.OnClickListener()
        {
            @Override
            public void onClick(DialogInterface dialog, int which) 
            {
                //checkbox.setChecked(true); // This ticks the last checkbox of the list.

                if(checkbox.getTag() == v.getTag())
                {
                    checkbox.setChecked(true);
                }   
            }
        });
        builder.show();

    }
});

答案 1 :(得分:1)

CheckBox扩展了TextView。使用CheckBox.setText(CharSequence | int)将文本设置为CheckBox并删除TextView(当然,这不会解决您的检查问题)。关于你的问题 - 这是因为大多数AdapterView都重用了Views。将检查的项目信息存储在某处并在getView中调用setChecked(checkedItems.get(pos))。

    @Override
    public View getView(int position, View convertView, ViewGroup parent) 
    {
        .....

        holder.chk.setChecked(checkedItems.get(position))

        .....

        builder.setNegativeButton("No", new DialogInterface.OnClickListener()
        {
            @Override
            public void onClick(DialogInterface dialog, int which) 
            {
                //holder.chk.setChecked(true); // This ticks the last checkbox of the list.

                if(holder.chk.getTag() == v.getTag())
                {
                    holder.chk.setChecked(true);
                    checkedItems.put(position, true);
                }
            }
        });
    }

其中checkedItems是SparseBooleanArray