3

我正在使用custom adpater in AlertDialog. 在那个适配器中,我正在使用TextView and CheckBox..现在我想处理 CheckBoxsetOnCheckedChangeListener以检查选中或未选中的 CheckBox..并且根据 CheckBox 的状态,我想实现一些代码。但是这个听众被解雇了不止一次。那我该如何处理呢?如果有人有想法,请建议我。

正是我的问题是当我选中复选框时,我想增加一些值,当我取消选中时,我想减少一些值。但我没有得到确切的总和值,如果我滚动,那么这个总和值会改变..所以我必须做什么?

以下是我的自定义 Adaper:

private class Updateinfo_ServiceAdapter extends BaseAdapter
{

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return _options_services.length;
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        Viewholder holder;
        LayoutInflater inflater=getLayoutInflater();

        if(convertView==null)
        {
            convertView=inflater.inflate(R.layout.row_updateinfo_service, null);
            holder=new Viewholder();
            holder.txtname=(TextView)convertView.findViewById(R.id.serviceName);
            holder.chkSelected=(CheckBox)convertView.findViewById(R.id.chk);
            convertView.setTag(holder);
        }
        else
        {
            holder=(Viewholder)convertView.getTag();
        }

        holder.txtname.setText(_options_services[position]);        
        holder.chkSelected.setChecked(_selections_services[position]);



        holder.chkSelected.setOnCheckedChangeListener(new OnCheckedChangeListener() 
        {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) 
            {

                if (isChecked) {
                    allowServicesSum = allowServicesSum
                            + Integer.parseInt((String) services[position]
                                    .getSystemServiceID());
                    System.out.println("AllowService sum is "+allowServicesSum);
                } else {
                    allowServicesSum = allowServicesSum
                            - Integer.parseInt((String) services[position]
                                    .getSystemServiceID());
                    System.out.println("AllowService sum is "+allowServicesSum);
                }
            }
        });

               if(_selections_services[position])
        {
            holder.chkSelected.setEnabled(false);
        }
        else
        {
            holder.chkSelected.setEnabled(true);
        }

        return convertView;
    }

    private class Viewholder
    {
        TextView txtname;
        CheckBox chkSelected;
    }

}
4

1 回答 1

3

您忘记了在重用现有 的情况下,convertView已经设置了侦听器。因此,当您这样做时holder.chkSelected.setChecked,这将触发您上次返回此视图时设置的侦听器getView

避免该问题的最简单方法是holder.chkSelected.setOnCheckedChangeListener(null);在线路后立即调用holder=(Viewholder)convertView.getTag();。这样可以确保您稍后调用时没有侦听器setChecked,之后您可以再次添加侦听器。

于 2013-08-06T10:36:39.963 回答