2017-08-22 9 views
0

J'ai un ListView personnalisé que chaque élément de ListView contient deux EditTexts. Par exemple quand je mets des valeurs pour EditText s dans le premier article de ListView, et après que je défile jusqu'à la fin de ListView, je vois que le dernier article de ListView est rempli automatiquement, et aussi quand je fais défiler vers le haut, le premier article perd ses valeurs.EditText perd de la valeur lors du défilement ListView android

REMARQUE: J'utilise TextWatcher dans ce cas. Que dois-je faire pour résoudre ce problème?

Ceci est mon adaptateur:

public class MyResultAdapter extends ArrayAdapter<Integer> { 

    ArrayList<HashMap<String, String>> boardInformation = new ArrayList<>(); 

    EditText foodPrice; 
    EditText foodName; 

    Context context; 
    int layoutView; 

    public MyResultAdapter(Context context, int layoutView) { 
     super(context, layoutView); 

     this.context = context; 
     this.layoutView = layoutView; 
    } 

    public View getView(int position, View convertView, ViewGroup parent){ 

     View view = convertView; 

     boolean convertViewWasNull = false; 
     if(view == null) 
     { 
      view = LayoutInflater.from(getContext()).inflate(layoutView, parent, false); 
      convertViewWasNull = true; 
     } 

     foodPrice = (EditText) view.findViewById(R.id.food_price); 
     foodName = (EditText) view.findViewById(R.id.food_name); 

     if(convertViewWasNull) 
     { 
      //be aware that you shouldn't do this for each call on getView, just once by listItem when convertView is null 
      foodPrice.addTextChangedListener(new GenericTextWatcher(foodPrice, position, "price")); 
      foodName.addTextChangedListener(new GenericTextWatcher(foodName, position, "name")); 
     } 

     return view; 
    } 

    private class GenericTextWatcher implements TextWatcher{ 

     private View view; 

     private int position; 
     private String name; 

     private GenericTextWatcher(View view, int position, String name) { 
      this.view = view; 
      this.position = position; 
      this.name = name; 
     } 

     public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {} 

     public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {} 

     public void afterTextChanged(Editable editable) 
     { 
      updateBoardInformationArray(editable.toString()); 
     } 


     private void updateBoardInformationArray(String newValue) 
     { 
      if(name.equals("name")) boardInformation.get(position).put("food_name", newValue); 
      else boardInformation.get(position).put("food_price", newValue); 
     } 
    } 
} 
+0

Eh bien, mec, je voudrais vous suggérez deux choses, d'abord essayer de travailler avec ViewHolder Pattern et étendre BaseAdapter pour votre adaptateur. Deuxièmement, essayez d'éviter listView la prochaine fois - utilisez Recycler View à la place, c'est beaucoup mieux que listview –

Répondre

0

Je suppose que vous savez que vous réutilisez les vues du ListView en utilisant la convertView - réutiliser les mêmes vues qui vont de l'écran pour les vues entrer dans l'écran.

Je vois que le dernier élément de ListView est rempli automatiquement

Ce pourrait être parce que ce point de vue a été réutilisée d'une autre vue où vous avez entré un texte dans le EditText.

et aussi lorsque je fais défiler vers le haut, le premier élément perd ses valeurs.

La même raison que ci-dessus. Une autre vue est réutilisée dans cette position.

Solution:

Enregistrer l'utilisateur texte saisi dans une liste de certains objets du modèle. Par exemple, comme ceci ArrayList<MyData>. L'objet MyData a le texte tapé. Et la liste a un objet pour chaque élément de votre liste.

Maintenant, dans le rappel getView, obtenez le texte du ArrayList<MyData> pour la position correspondante et réglez-le sur EditText.