2016-07-28 3 views
0

Ich habe eine erweiterbare Ansicht erstellt, die unter jeder Gruppe ein editText-Feld enthält.Werte von editText-Boxen in einer erweiterbaren Listenansicht unter Android beibehalten

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); 

Adapter Code:

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.... 

    } 

Aufgrund der Adapter-Funktionalität, die die Ansichten zu recyceln ist, wenn ich dieser Wert einen Text in ein Eingabefeld eingeben entweder verloren gehen oder auch in anderen Bearbeitungsfelder kopiert wenn ich auf und ab scrolle.

In der Listenansicht wird ein Array zum Speichern von Werten von Bearbeitungsfeldern verwendet.

Was ist der beste Weg, um es in einer erweiterbaren Listenansicht zu tun? Array von Arrays? Können Sie ein Beispiel für eine erweiterbare Listenansicht und nicht für eine Listenansicht angeben?

EDIT: versucht, dieses aber ich auch Probleme haben:

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 ist ein Array String [10] [10]. Meine Gruppen sind 3 und Kinder sind maximal 7 in einer Gruppe, also ist das Array nicht kleiner als meine Daten.

+0

Mögliche Duplikate von [Android: EditText verliert Inhalt auf Bildlauf in ListView?] (Http://stackoverflow.com/questions/9328301/android-editext-lose-content-on-scroll-in-listview) – SaravInfern

+0

das ist für die Listenansicht. Ich habe eine erweiterbare Listenansicht. –

+0

Es ist nicht mater @mike_x_, Sie müssen 'addTextChangedListener' verwenden, um den Wert vor dem Scrollen zu speichern, da Sie den Wert nicht beibehalten, wenn Ihre Daten nicht gespeichert werden und Sie diese verloren haben. –

Antwort

0

Das Problem ist der TestWatcher. Es feuert jede Methode viele Male und ich habe nicht herausgefunden warum. Also die Lösung war, FocusChangeListener zu verwenden oder viel besser, einen alertDialog anzuzeigen, um das Feld zu füllen. Dann habe ich bei positivem Klick die Daten im Array gespeichert.

Also durch Ersetzen von TextWatcher konnte ich das Problem lösen.

Verwandte Themen