2016-07-28 1 views
0

J'ai créé une vue extensible qui contient une zone editText sous chaque groupe.Conserver les valeurs des zones editText dans une vue de liste extensible sur Android

public class ExpandableActivity extends AppCompatActivity { 

     ExpandableListAdapter listAdapter; 
     ExpandableListView expListView; 
     List<String> listDataHeader; 
     HashMap<String, List<String>> listDataChild; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_expandable); 

      expListView = (ExpandableListView) findViewById(R.id.expandableListView); 
      expListView.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS); 

      // preparing list data 
//custom function that populates listDataHeader and listDataChild 
      prepareListData(); 

      listAdapter = new ExpandableListAdapter(this, listDataHeader, listDataChild); 
      expListView.setAdapter(listAdapter); 

code Adaptateur:

public class ExpandableListAdapter extends BaseExpandableListAdapter { 

     private Context context; 
     private List<String> listDataHeader; 
     private HashMap<String, List<String>> listDataChild; 

     public ExpandableListAdapter(Context context, List<String> listDataHeader, 
            HashMap<String, List<String>> listChildData) { 
      this.context = context; 
      this.listDataHeader = listDataHeader; 
      this.listDataChild = listChildData; 
     } 


     @Override 
     public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { 
      final String childText = (String) getChild(groupPosition, childPosition); 

      if (convertView == null) { 
       LayoutInflater infalInflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       convertView = infalInflater.inflate(R.layout.e_list_item, null); 
      } 

      TextView vw_text_sub = (TextView) convertView.findViewById(R.id.esubt); 
      EditText vw_edit = (EditText) convertView.findViewById(R.id.eedit); 

      vw_text_sub.setText(childText); 

      vw_edit.addTextChangedListener(new TextWatcher() { 

       @Override 
       public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {    
         //store value? 
       } 

       @Override 
       public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { 
       } 

       @Override 
       public void afterTextChanged(Editable arg0) { 
       } 
      }); 

      return convertView; 
     } 



     @Override 
     public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { 
      String headerTitle = (String) getGroup(groupPosition); 
      if (convertView == null) { 
       LayoutInflater infalInflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       convertView = infalInflater.inflate(R.layout.e_list_group, null); 
      } 

      TextView vw_header = (TextView) convertView.findViewById(R.id.eheader); 
      vw_header.setTypeface(null, Typeface.BOLD); 
      vw_header.setText(headerTitle); 

      return convertView; 
     } 

// other overridden methods here.... 

    } 

En raison de la fonctionnalité de l'adaptateur qui est de recycler les points de vue, chaque fois que je tape un texte dans une zone d'édition cette valeur est perdue ou copiée dans d'autres zones d'édition trop quand je défile de haut en bas.

En mode liste, un tableau est utilisé pour stocker les valeurs des zones d'édition.

Quelle est la meilleure façon de le faire dans une vue de liste extensible? Tableau de tableaux? Pouvez-vous donner un exemple pour une vue de liste extensible et non une vue de liste?

EDIT: J'ai essayé cela, mais j'ai aussi des problèmes:

public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { 
     final String childText = (String) getChild(groupPosition, childPosition); 

     if (convertView == null) { 
      LayoutInflater infalInflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = infalInflater.inflate(R.layout.e_list_item, null); 
     } 

     TextView vw_text_sub = (TextView) convertView.findViewById(R.id.esubt); 
     EditText vw_edit = (EditText) convertView.findViewById(R.id.eedit); 

     vw_text_sub.setText(childText); 
     if(tmp[groupPosition][childPosition] != null) { 
      vw_edit.setText(tmp[groupPosition][childPosition]); 
     }else{ 
      vw_edit.setText(""); 
     } 

     vw_edit.addTextChangedListener(new TextWatcher() { 

      @Override 
      public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { 
       tmp[groupPosition][childPosition] = arg0.toString(); 
      } 

      @Override 
      public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { 
      } 

      @Override 
      public void afterTextChanged(Editable arg0) { 
      } 
     }); 

     return convertView; 
    } 

tmp est un tableau String [10] [10]. Mes groupes sont 3 et les enfants sont au maximum 7 dans un groupe, donc le tableau n'est pas plus petit que mes données.

+0

Possible doublon de [Android: EditText perd du contenu sur défilement dans ListView?] (Http://stackoverflow.com/questions/9328301/android-edittext-loses-content-on-scroll-in-listview) – SaravInfern

+0

c'est pour la vue de liste. J'ai une vue de liste extensible. –

+0

Ce n'est pas mater @mike_x_, vous devez utiliser 'addTextChangedListener' pour stocker la valeur avant le défilement, car vous ne perdez pas la valeur que vos données ne sont pas sauvegardées et vous avez perdu cela. –

Répondre

0

Le problème est le TestWatcher. Il déclenche chaque méthode plusieurs fois et je n'ai pas trouvé pourquoi. La solution consistait donc à utiliser FocusChangeListener ou beaucoup mieux pour afficher un alertDialog afin de remplir le champ. Ensuite, sur un bouton positif, j'ai stocké les données dans le tableau. Donc, en remplaçant TextWatcher j'ai réussi à résoudre le problème.