Question

Je veux mettre en œuvre RadioButton et EditText l'intérieur d'une rangée d'une ListView. J'utilise un ArrayAdapter pour remplir la liste. Mais le problème est que quand je suis la sélection d'un RadioButton et faites défiler la liste et faites défiler à nouveau la Radiobutton qui avait été sélectionné est désélectionné. Même avec le contenu de la EditText. Le texte se retire quand je défiler vers le haut.

Était-ce utile?

La solution

Vérifiez votre adaptateur, vous êtes probablement ne pas faire du bon travail sur bindView(). Vous devez à nouveau régler sur bindView() les valeurs.

Je vais reformuler la phrase et vous sera probablement comprendre. Le newView() ne crée que 5-10 vues (autant qu'ils correspondent à l'écran), et ils sont réutilisés pour d'autres lignes. Si vous avez un ListView avec 200 lignes, vous avez fait seulement 5-10 points de vue, et vous devez vous assurer de mettre à jour les vues avec les changements valides dans bindView(). Vous devez stocker / enregistrer les modifications apportées à un objet pour une réutilisation ultérieure.

Autres conseils

Le problème est que toutes les vues qui laissent l'écran peut être détruit pour économiser la mémoire sur le téléphone. Si le téléphone ne ferait pas cette liste de 1000 entrées avec une remplirait la mémoire de votre appareil.

En raison de ce changement d'état qui se passe à l'RadioButton et le texte qui a été inséré dans le edittext seront simplement supprimés et si seront recréés l'utilisateur fait défiler jusqu'à la vue.

Vous devez enregistrer l'état du bouton radio et le texte d'édition dans l'adaptateur et appliquez à nouveau l'état au moment où vous recréez la vue de cet élément spécial vous méthode de getView.

Fonction getView dans l'adaptateur de base. Enregistre la valeur edittext et affiche le même si convertView est non nulle.

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