设置可扩展列表中所有子视图的组件值

Set values of components of all Child views in Expandable List

我有一个可扩展列表,代表我程序中的设置。组视图有一个 TextView 描述和一个代表重置的按钮。子视图有一个 TextView 描述和一个 EditText 代表一个单独的设置。

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。

好的,经过大量搜索(并改写我的搜索!)我发现了方法 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();
    }