2012-04-11 1 views
0

Bien que je sache qu'il n'est pas possible pour moi de faire référence à une variable non-finale dans ma méthode onClick, je suis curieux de savoir comment je résous le problème auquel je suis actuellement confronté."Impossible de se référer à une variable non-finale dans la classe interne" Comment est-ce que je manipule un TextView en fonction de l'état d'une case à cocher?

J'ai un ArrayAdapter. Si un utilisateur appuie sur la case à cocher une asyncTask et que l'utilisateur s'abonne ou se désinscrit dans une file d'attente, selon que la case est cochée ou non.

Je souhaite que cet état apparaisse dans chaque élément du texte de mon TextView txtStatus. Comment définir le texte d'un TextView en fonction du statut d'une case à cocher?

Voici une partie du code de ma méthode de getView:

@Override 
public View getView(int position, View convertView, ViewGroup parent) 
{ 
    View row = convertView; 

    final CheckBox queueCBox; 
    userControl = new UserController(context); 
    final String queueName = data[position].label; 
    if(row == null) 
    { 
     LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
     row = inflater.inflate(layoutResourceId, parent, false); 

     final QueueHolder holder = new QueueHolder(); 
     holder.queuecbox = (CheckBox)row.findViewById(R.id.queues_item_checkbox); 
     queueCBox = (CheckBox)row.findViewById(R.id.queues_item_checkbox); 
     holder.txtLabel = (TextView)row.findViewById(R.id.queues_item_label); 
     holder.txtStatus = (TextView)row.findViewById(R.id.queues_item_status); 

     holder.queuecbox.setOnClickListener(new OnClickListener() 
     { 
      @Override 
      public void onClick(View v) 
      { 
       final String[] param = new String[1]; 
       param[0] = queueName; 

       if(queueCBox.isChecked()) 
       { 
        holder.txtStatus.setText("Tilmeldt"); 
        Log.d("ClickTest","SWITCH ON"); 
        new JoinQueueTask().execute(param); 


       } 
       else 
       { 
        holder.txtStatus.setText("Frameldt"); 
        Log.d("ClickTest","SWITCH OFF"); 
        new LeaveQueueTask().execute(param); 
       } 
      } 
     }); 
     row.setTag(holder); 
    } 
    else 
    { 
     final QueueHolder holder = (QueueHolder)row.getTag(); 
    } 

    QueueItem queue = data[position]; 
    String name = queue.label.replace("-", " "); 
    holder.txtLabel.setText(name); // holder cannot be resolved 
    holder.queuecbox.setChecked(queue.value); // holder cannot be resolved 

    return row; 
} 

Répondre

6

Gardez votre porte la façon dont il est. Juste pour le réglage de la onClickListener, essayez de faire cela,

QueueHolder holder = null; 
if(row == null) 
{ 
    LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
    row = inflater.inflate(layoutResourceId, parent, false); 

    holder = new QueueHolder(); 
    holder.queuecbox = (CheckBox)row.findViewById(R.id.queues_item_checkbox); 
    queueCBox = (CheckBox)row.findViewById(R.id.queues_item_checkbox); 
    holder.txtLabel = (TextView)row.findViewById(R.id.queues_item_label); 
    holder.txtStatus = (TextView)row.findViewById(R.id.queues_item_status); 
    row.setTag(holder); 
} 
else 
{ 
    holder = (QueueHolder)row.getTag(); 
} 

QueueItem queue = data[position]; 
String name = queue.label.replace("-", " "); 
holder.txtLabel.setText(name); // holder cannot be resolved 
holder.queuecbox.setChecked(queue.value); // holder cannot be resolved 

final QueueHolder fianlHolder = holder; 

finalHolder.queuecbox.setOnClickListener(new OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 
      final String[] param = new String[1]; 
      param[0] = queueName; 

      if(queueCBox.isChecked()) 
      { 
       finalHolder.txtStatus.setText("Tilmeldt"); 
       Log.d("ClickTest","SWITCH ON"); 
       new JoinQueueTask().execute(param); 


      } 
      else 
      { 
       finalHolder.txtStatus.setText("Frameldt"); 
       Log.d("ClickTest","SWITCH OFF"); 
       new LeaveQueueTask().execute(param); 
      } 
     } 
    }); 
return row; 
} 
+0

Si je fais ce support ne peut donc pas être résolu lorsque je tente de mettre le texte de l'étiquette et l'état de la case à cocher plus tard dans la méthode. holder.txtLabel.setText (nom); holder.queuecbox.setChecked (queue.value); – CodePrimate

+0

Avez-vous essayé de le faire? Pour autant que je sache, dans ce cas, votre objet titulaire devient final et non les variables membres du titulaire. Je peux me tromper sur la partie 'finale'. – Shubhayu

+0

Oui. J'ai édité mon post original avec l'ensemble getView(). Regardez les deux dernières lignes – CodePrimate

Questions connexes