3

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

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

Ниже мой заказ 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; 
    } 

} 

ответ

3

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

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

+0

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

+0

Я обновил свой ответ, чтобы было ясно, что вы должны ** отключить ** слушателя. Извините, что было непонятно изначально. –

+0

если я отключил прослушиватель, то все еще есть проблема. Если я проверил элемент и прокрутку вниз, то выбранный элемент будет автоматически снят. так что здесь делать? –

Смежные вопросы