我有一个可扩展列表,表示我的程序中的设置。组视图具有TextView描述,其中Button表示重置。子视图具有TextView描述,其中EditText表示单个设置。
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 :(得分:0)
在经过多次搜索(并重新调整我的搜索后)后确定!我发现了方法notifyDataSetChanged();
所以我所做的就是向Button click侦听器添加一个方法,该方法调用一个方法来重置设置,然后调用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();
}