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.
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
das ist für die Listenansicht. Ich habe eine erweiterbare Listenansicht. –
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. –