2016-08-02 95 views
0

我有一個展開式列表,代表我的程序中的設置。組視圖有一個帶有表示重置的Button的TextView描述。子視圖具有帶有表示單個設置的EditText的TextView描述。設置展開式列表中所有子視圖組件的值

enter image description here

的EditText上的值保存在外部變量並且在任何改變而更新。點擊組視圖中的重置按鈕後,我想將EditTexts中包含的所有單個設置重置爲默認值。這可以工作,但是當然,在重新繪製子視圖之前,EditTexts視圖不會更新。點擊重置按鈕後,我希望所有視圖都立即改變。

我嘗試了無數的事情,但仍然遇到問題。我似乎無法訪問重置Button偵聽器中的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(); 
    } 
相關問題