2016-08-02 47 views
0

Ich habe eine erweiterbare Liste, die Einstellungen in meinem Programm darstellt. Die Gruppenansicht verfügt über eine TextView-Beschreibung mit einem Button, der ein Zurücksetzen darstellt. Die untergeordnete Ansicht hat eine TextView-Beschreibung mit einem EditText, der eine individuelle Einstellung darstellt.Legen Sie Werte von Komponenten aller untergeordneten Ansichten in der erweiterbaren Liste fest

enter image description here

Die Werte der EditText werden in externen Variablen und aktualisiert bei jeder Änderung gespeichert. Mit einem Klick auf die Reset-Schaltfläche in der Gruppenansicht möchte ich alle in den EditTexts enthaltenen individuellen Einstellungen auf die Standardwerte zurücksetzen. Dies funktioniert, aber natürlich werden die EditTexts-Ansichten erst aktualisiert, wenn die untergeordneten Ansichten neu gezeichnet werden. Ich möchte, dass sich die Ansichten sofort ändern, wenn Sie auf den Reset-Knopf klicken.

Ich habe eine Vielzahl von Dingen versucht, aber immer wieder in Probleme zu laufen. Ich kann anscheinend nicht auf die EditText-Ansichten innerhalb des Reset-Button-Listeners zugreifen, um den Text programmgesteuert festzulegen.

Meine erweiterbare Liste (gekürzt):

public class ExpandableListAdapter extends BaseExpandableListAdapter 
{ 
private String[] listGroups; 
private String[][] listChilds; 
private Activity context; 
final EditText[] etIndividualLetterValues = new EditText[26]; 

public ExpandableListAdapter(Activity context, String[] listGroups, String[][] listChilds) 
    { 
    this.context = context; 
    this.listGroups = listGroups; 
    this.listChilds = listChilds; 

@Override 
public View getChildView(final int listGroupPosition, final int listChildPosition, boolean isLastChild, 
         View view, ViewGroup viewGroup) 
    { 
    LayoutInflater inflater = context.getLayoutInflater(); 
    TextView tvListItemGeneral; 

    tvListItemGeneral = (TextView) view.findViewById(R.id.TV_list_item_general); 
    tvListItemGeneral.setText(getChild(listGroupPosition, listChildPosition).toString()); 

    etIndividualLetterValues[listChildPosition] = (EditText) view.findViewById(R.id.ET_list_item_settings_value); 
    etIndividualLetterValues[listChildPosition].setText(String.format("%d", Settings.settingsCurrent[listGroupPosition][listChildPosition])); 

    etIndividualLetterValues[listChildPosition].addTextChangedListener(new TextWatcher() 
     { 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) 
      { 
      } 
     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) 
      { 
      Settings.settingsCurrent[listGroupPosition][listChildPosition] = Integer.parseInt(s.toString()); 
      } 
     @Override 
     public void afterTextChanged(Editable s) 
      { 

      } 
     }); 
    } 

@Override 
public View getGroupView(final int listGroupPosition, boolean isExpanded, View view, ViewGroup viewGroup) 
    { 
    LayoutInflater layoutInflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    if(view == null) 
     { 
     view = layoutInflater.inflate(R.layout.list_group, viewGroup, false); 
     } 
    TextView tvListGroup = (TextView) view.findViewById(R.id.TV_list_group); 
    Button buttonSettingsReset = (Button) view.findViewById(R.id.B_settings_reset); 
    buttonSettingsReset.setOnClickListener(new View.OnClickListener() 
     { 
     @Override 
     public void onClick(View v) 
      { 
      if(listGroupPosition == C.INDIVIDUAL_LETTER_VALUES) 
       { 
       for(int i=0; i<26; i++) 
        { 
        etIndividualLetterValues[i].setText(String.format("%d", Settings.settingsDefault[C.INDIVIDUAL_LETTER_VALUES][i])); 
        } 
       } 
      } 
     }); 
    tvListGroup.setText(getGroup(listGroupPosition).toString()); 
    return view; 
    }  

Die Codezeile:

etIndividualLetterValues[i].setText(String.format("%d", Settings.settingsDefault[C.INDIVIDUAL_LETTER_VALUES][i])); 

gibt einen NPE.

Antwort

0

OK nach viel Suche (und Umformulierungen meiner Suchen!) Ich habe über die Methode notifyDataSetChanged();

Also alles, was ich tat, war eine Methode, um den Button-Klick-Listener hinzufügen, die eine Methode namens Einstellungen zurücksetzen und dann notifyDataSetChanged() aufgerufen:

buttonSettingsReset.setOnClickListener(new View.OnClickListener() 
    { 
    @Override 
    public void onClick(View v) 
     { 
     if(listGroupPosition == C.INDIVIDUAL_LETTER_VALUES) 
      { 
      refresh(listGroupPosition); 
      } 
     } 
    }); 

//... 

public void refresh(int settingsID) 
    { 
    resetSettingsClick(context, settingsID); 
    this.notifyDataSetChanged(); 
    }