2016-08-02 1 views
0

J'ai une liste extensible qui représente les paramètres de mon programme. La vue de groupe a une description TextView avec un bouton qui représente une réinitialisation. La vue enfant a une description TextView avec un EditText qui représente un paramètre individuel.Définir les valeurs des composants de toutes les vues enfant dans la liste extensible

enter image description here

Les valeurs du EditText sont enregistrées dans des variables externes et mises à jour lors de tout changement. Après avoir cliqué sur le bouton de réinitialisation dans la vue de groupe, je souhaite réinitialiser tous les paramètres individuels contenus dans les EditTexts aux valeurs par défaut. Cela fonctionne mais, bien sûr, les vues EditTexts ne sont pas mises à jour tant que les vues enfant ne sont pas redessinées. Je veux que les vues changent immédiatement après un clic sur le bouton de réinitialisation. J'ai essayé une myriade de choses, mais je continue de rencontrer des problèmes. Je n'arrive pas à accéder aux vues EditText dans l'écouteur de bouton de réinitialisation pour définir le texte par programmation.

Ma liste Extensible (abrégée):

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

La ligne de code:

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

donne un NPE.

Répondre

0

OK après beaucoup de recherche (et reformuler mes recherches!) J'ai découvert la méthode notifyDataSetChanged();

Donc tout ce que je ne faisais ajouter une méthode à l'auditeur de clic de bouton qui a appelé une méthode pour réinitialiser les paramètres, puis appelé notifyDataSetChanged():

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