2013-01-06 4 views
0

J'ai un listview qui a un adaptateur personnalisé où chaque ligne a une vue de texte sur la gauche et un edittext sur la droite de celui-ci que l'utilisateur peut utiliser pour modifier une valeur d'entrée.Modifier dynamiquement les données dans l'adaptateur ListView

Les valeurs qui sont placées dans les vues EditText dans chaque vue par défaut sont obtenues à partir d'un tableau String transmis à l'adaptateur.

Je me demande comment je peux permettre à l'utilisateur de modifier ces valeurs et sauvegarder les résultats dans le même tableau de chaînes.

J'ai essayé d'ajouter un écouteur de modification de texte, de sorte que lorsque l'utilisateur modifie la valeur, la nouvelle chaîne est placée à la position appropriée dans le tableau de chaînes d'origine. Le problème avec ceci est que lorsque l'utilisateur fait défiler l'écouteur de changement de texte est activé et la valeur dans le tableau est remplacée par une chaîne vide.

Voici un code:

public EditTagsListViewAdapter(Context context, String[] objectKeys, String[] objectValues) { 
     super(); 
     this.context = context; 
     this.objectKeys = objectKeys; 
     this.objectValues = objectValues; 
    } 

    @Override 
    public int getCount() { 
     return objectKeys.length; 
    } 

    @Override 
    public String[] getItem(int position) { 
     String[] item = new String[2]; 
     item[0] = objectKeys[position]; 
     item[1] = objectValues[position]; 
     return item; 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     ViewHolder holder = null; 

     LayoutInflater mInflater = (LayoutInflater)context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.edit_osm_tag_row, null); 
      holder = new ViewHolder(); 
      holder.key = (TextView) convertView.findViewById(R.id.tagKey); 
      holder.value = (EditText) convertView.findViewById(R.id.tagValue); 

      convertView.setTag(holder); 
     } 
     else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     String[] rowItem = (String[]) getItem(position); 

     holder.key.setText(rowItem[0]); 
     if(rowItem[1].equals("null")) { 
      holder.value.setText(""); 
     } else { 
      holder.value.setText(rowItem[1]); 
     } 

     holder.value.addTextChangedListener(new TextWatcher() { 

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

      } 

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

      } 

      @Override 
      public void afterTextChanged(Editable s) { 
       objectValues[position] = s.toString(); 
       Log.i(TAG, "Added changes to adapter"); 

      } 
     }); 


     return convertView; 
    } 


    static class ViewHolder { 
     protected TextView key; 
     protected EditText value; 
    } 

Je mis quelques valeurs EditText à vide après la if(rowItem[1].equals("null")) { parce que certaines des valeurs dans les objectValues ​​variables sera définie comme la chaîne « null » mais je veux qu'ils apparaissent blanc.

Espérons que cela a du sens. Est-ce que quelqu'un sait comment je peux y parvenir?

Merci

Répondre

0

plutôt que le TextWatcher, vous pouvez utiliser un OnEditorActionListener pour enregistrer les modifications lorsque l'utilisateur appuie sur « Entrée » du clavier.

editText.setOnEditorActionListener(new OnEditorActionListener() { 
    @Override 
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
     if(actionId == EditorInfo.IME_NULL && event.getAction() == KeyEvent.ACTION_DOWN) { 
      objectValues[position] = v.getText().toString(); 
      return true; 
     } 

     return false; 
    } 
}); 
2

En général, votre source de données ne doit pas être étroitement couplée à votre vue/adaptateur. Cela signifie que vous pouvez modifier les données de cette source de données, qu'elles soient utilisées par votre vue ou non. Lorsque l'utilisateur souhaite modifier les données, il vous suffit de mettre à jour votre source (votre tableau), puis d'indiquer à l'adaptateur/à la vue de redessiner. Certains adaptateurs peuvent vous demander de modifier leur contenu, mais si vous implémentez votre propre adaptateur à partir de rien ou si vous utilisez une classe d'adaptateur faiblement couplée, vous ne rencontrerez aucun problème.

Si vous utilisez un adaptateur qui étend BaseAdapter, vous pouvez simplement appeler notifyDataSetChanged() et l'adaptateur doit trouver le reste.

Questions connexes