2010-06-17 3 views
3

Je souhaite implémenter RadioButton et EditText dans une ligne d'un ListView. J'utilise un ArrayAdapter pour remplir la liste. Mais le problème est que lorsque je sélectionne un RadioButton et que je fais défiler la liste vers le haut et que je défile de nouveau vers le haut, le Radiobutton qui a été sélectionné n'est pas sélectionné. Idem avec le contenu de l'EditText. Le texte est supprimé lorsque je défile.Comment afficher un RadioButton et un EditText dans ListView?

Répondre

2

Vérifiez votre adaptateur, vous ne faites probablement pas le travail juste sur bindView(). Vous devez définir à nouveau les valeurs bindView().

Je vais reformuler la phrase et vous comprendrez probablement. Le newView() crée seulement 5 à 10 vues (autant qu'elles correspondent à l'écran), et elles sont réutilisées pour les autres lignes. Si vous avez un ListView avec 200 lignes, vous avez seulement 5-10 vues, et vous devez vous assurer que vous mettez à jour les vues avec les changements valides dans bindView(). Vous devez stocker/enregistrer les modifications apportées à un objet pour les réutiliser ultérieurement.

+0

Je ne peux pas vous aider. Pouvez-vous s'il vous plaît expliquer un peu plus avec l'exemple ... merci beaucoup. – Sujit

+0

Postez votre adaptateur pour voir ce que vous faites mal. Pensez que vous avez 5 lignes seulement pour 200 enregistrements, et vous devez les réutiliser tout le temps pour n'importe quelle gamme est affichée. – Pentium10

+0

pouvez-vous s'il vous plaît fournir votre email-ID afin que je puisse vous envoyer le code .. – Sujit

2

Le problème est que toutes les vues qui quittent l'écran peuvent être détruites pour économiser de la mémoire sur le téléphone. Si le téléphone ne le ferait pas, une liste de 1000 entrées remplirait la mémoire de votre appareil. Pour cette raison, le changement d'état qui arrive au radiobutton et le texte qui a été inséré dans le edittext seront simplement supprimés et si l'utilisateur fait défiler la vue sera recréée.

Vous devez enregistrer l'état du radiobutton et le texte d'édition dans votre adaptateur et réappliquer l'état au moment où vous recréerez la vue pour cet élément spécial dans votre méthode getView.

+0

Pouvez-vous expliquer comment sauvegarder l'état de RadioButton et EditText dans l'adaptateur. .. ??? Merci beaucoup .. – Sujit

0

Fonction getView dans l'adaptateur de base. Enregistre la valeur edittext et affiche la même chose si convertView n'est pas nul.

public View getView(int position, View convertView, ViewGroup parent) { 
     final ViewHolder holder; 
     if (convertView == null) { 
      convertView = layoutInflater.inflate(R.layout.list_row_person, null); 
      holder = new ViewHolder(); 
      holder.PersonNameView = (TextView) convertView.findViewById(R.id.PersonNameView); 
      holder.SpendAmount = (EditText) convertView.findViewById(R.id.SpendAmt); 
      holder.SpendAmount.addTextChangedListener(new TextWatcher() { 

       @Override 
       public void onTextChanged(CharSequence s, int start, int before, int count) { 
        // TODO Auto-generated method stub 
        int position2 = holder.SpendAmount.getId(); 
        EditText Caption = (EditText) holder.SpendAmount; 
        Person per= (Person)holder.SpendAmount.getTag(); 
        //SpendAmount is of Double type 
        if(s.toString().length()>0){ 
        per.setSpendAmount(Double.parseDouble(s.toString())); 
        per.setFlag(true);} 
        else{ 
         Toast.makeText(getApplicationContext(), "Please enter some value", Toast.LENGTH_SHORT).show(); 
         } 





       } 

       @Override 
       public void beforeTextChanged(CharSequence s, int start, int count, 
         int after) { 
        // TODO Auto-generated method stub 

       } 

       @Override 
       public void afterTextChanged(Editable s) { 
        // TODO Auto-generated method stub 

       } 
      }); 




      holder.SpendAmount.setTag(listData.get(position)); 
      convertView.setTag(holder); 

     } else { 

      ((ViewHolder)convertView.getTag()).SpendAmount.setTag(listData.get(position)); 
      holder = (ViewHolder) convertView.getTag(); 

     } 


     holder.PersonNameView.setText(listData.get(position).getPersonName()); 
     holder.SpendAmount.setText(listData.get(position).getSpendAmount().toString()); 



     return convertView; 




    } 
    class ViewHolder { 
     TextView PersonNameView; 
     EditText SpendAmount ; 
      } 
Questions connexes