Alertdialg флажок с пользовательских соответствующие адаптер и своего слушателя


Я использую custom adpater in AlertDialog. В этом адаптере я использую TextView and CheckBox.. Теперь я хочу обработать CheckBox setOnCheckedChangeListener для проверки checked или unchecked CheckBox.. И в соответствии со статусом флажка, я хочу реализовать некоторый код. Но этот слушатель уволен не один раз.. Так как же мне с этим справиться? Предложите мне, если у кого-нибудь есть идея.

И именно моя проблема заключается в том, что когда я установил флажок, я хочу увеличить некоторое значение, а когда я снял флажок, я хочу уменьшить некоторое значение.но я не могу сказать точно. значение sum, и если я прокручиваю, то это значение sum изменяется.. так что же мне делать?

Ниже приведен мой пользовательский адаптер:

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;
    }

}
1 3

1 ответ:

Вы забыли, что в случае повторного использования существующего convertView прослушиватель уже установлен. Таким образом, когда вы делаете holder.chkSelected.setChecked, это вызовет прослушиватель, который был установлен в предыдущий раз, когда вы вернули это представление из getView.

Самый простой способ избежать этой проблемы-позвонить holder.chkSelected.setOnCheckedChangeListener(null); сразу после строки holder=(Viewholder)convertView.getTag();. Это гарантирует отсутствие прослушивателя при последующем вызове setChecked, после чего вы можете добавить прослушиватель снова.