2016-08-02 4 views
0

私のプログラムの設定を表す展開可能なリストがあります。グループビューには、リセットを表すボタン付きのTextViewの説明があります。子ビューには、個々の設定を表すEditTextを含むTextViewの説明があります。拡張可能リスト内のすべての子ビューのコンポーネントの値を設定する

enter image description here

のEditTextの値は、外部変数に保存され、任意の変更時に更新されます。グループビューでリセットボタンをクリックすると、EditTextsに含まれている個々の設定をすべてデフォルト値にリセットします。これは動作しますが、もちろんEditTextsビューは子ビューが再描画されるまで更新されません。リセットボタンをクリックするとすぐにビューがすべて変更されるようにします。

私は数多くのことを試しましたが、問題は継続しています。プログラムでテキストを設定するために、リセットボタンリスナー内のEditTextビューにアクセスできないようです。

マイ拡張可能なリスト(簡略):

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

コードの行:

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

は、NPEを与えます。

答えて

0

多くの検索の後で(そして私の検索の言い換え!)メソッドnotifyDataSetChanged()について知りました。

は、だから私が行ったすべての設定をリセットするメソッドを呼び出しボタンのクリックリスナーにメソッドを追加し、次いで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(); 
    } 
関連する問題