在可扩展列表

时间:2016-08-02 02:33:42

标签: android expandablelistview expandablelistadapter

我有一个可扩展列表,表示我的程序中的设置。组视图具有TextView描述,其中Button表示重置。子视图具有TextView描述,其中EditText表示单个设置。

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。

1 个答案:

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