简体   繁体   中英

notifyDataSetChanged() fails to update adapter onClick

I'm following this tutorial on ExpandableListViews. I want my implementation to show a new value added after tapping a button. However, nothing I have tried works. In addition to playing around with notifyDataSetChanged(), I also tried notifyDataSetInvalidated() and instantiating a new adapter, which were suggested in similar posts. The new data that isn't showing up is under my onClick method.

Any suggestions on a fix?

public class ClassesFragment extends Fragment implements OnClickListener {
private View v;

 Integer term;
 String termSelection;

 ListView myList;
 EditText editText1;
 Spinner spinner;

 MyExpandableListAdapter adapter;
 ExpandableListView listView;

 SparseArray<Group> groups = new SparseArray<Group>();

 Group fall2013 = new Group("Fall 2013");
 Group winter2014 = new Group("Winter 2014");
 Group spring2014 = new Group("Spring 2014");
 Group summer2014 = new Group("Summer 2014");


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    v = inflater.inflate(R.layout.fragment_classes, container, false);

    editText1 = (EditText) v.findViewById(R.id.editText1);

    Spinner spinner = (Spinner) v.findViewById(R.id.spinner1);
    spinner.setOnItemSelectedListener(new SpinnerItemSelectedListener());



    Button add = (Button) v.findViewById(R.id.button1);
    add.setOnClickListener(this);

    createData();
    listView = (ExpandableListView) v.findViewById(R.id.expandableListView1);
    adapter = new MyExpandableListAdapter(getActivity(), groups);
    listView.setAdapter(adapter);
    return v;              
}

public void createData() {      
    groups.append(0, fall2013);
    groups.append(1, winter2014);
    groups.append(2, spring2014);
    groups.append(3, summer2014);

}

@SuppressWarnings("boxing")
public void onClick(View v) {
    switch (v.getId()) {           
        case R.id.button1:                  

            Integer crn = Integer.parseInt(editText1.getText().toString());
            editText1.setText("");

            if (termSelection.toString() == "Fall 2013") {                      

                fall2013.children.add(crn.toString());
                adapter.notifyDataSetChanged();
            }

            break;

            case R.id.button2:
                Toast.makeText(getActivity(), "Clicked on delete button", Toast.LENGTH_LONG).show();
                break;  

        }
   }


   public class SpinnerItemSelectedListener implements OnItemSelectedListener {
        public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
            termSelection = parent.getItemAtPosition(pos).toString();
        }

        public void onNothingSelected(AdapterView parent) {
        }
    }
}

My custom adapter:

public class MyExpandableListAdapter extends BaseExpandableListAdapter {

  private final SparseArray<Group> groups;
  public LayoutInflater inflater;
  public Activity activity;

  public MyExpandableListAdapter(Activity act, SparseArray<Group> groups) {
    activity = act;
    this.groups = groups;
    inflater = act.getLayoutInflater();
  }

  @Override
  public Object getChild(int groupPosition, int childPosition) {
    return groups.get(groupPosition).children.get(childPosition);
  }

  @Override
  public long getChildId(int groupPosition, int childPosition) {
    return 0;
  }

  @Override
  public View getChildView(int groupPosition, final int childPosition,
      boolean isLastChild, View convertView, ViewGroup parent) {
    final String children = (String) getChild(groupPosition, childPosition);
    TextView text = null;
    if (convertView == null) {
      convertView = inflater.inflate(R.layout.listrow_details, null);
    }
    text = (TextView) convertView.findViewById(R.id.textView1);
    text.setText(children);
    convertView.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View v) {
        Toast.makeText(activity, children,
            Toast.LENGTH_SHORT).show();
      }
    });
    return convertView;
  }

  @Override
  public int getChildrenCount(int groupPosition) {
    return groups.get(groupPosition).children.size();
  }

  @Override
  public Object getGroup(int groupPosition) {
    return groups.get(groupPosition);
  }

  @Override
  public int getGroupCount() {
    return groups.size();
  }

  @Override
  public void onGroupCollapsed(int groupPosition) {
    super.onGroupCollapsed(groupPosition);
  }

  @Override
  public void onGroupExpanded(int groupPosition) {
    super.onGroupExpanded(groupPosition);
  }

  @Override
  public long getGroupId(int groupPosition) {
    return 0;
  }

  @Override
  public View getGroupView(int groupPosition, boolean isExpanded,
      View convertView, ViewGroup parent) {
    if (convertView == null) {
      convertView = inflater.inflate(R.layout.listrow_group, null);
    }
    Group group = (Group) getGroup(groupPosition);
    ((CheckedTextView) convertView).setText(group.string);
    ((CheckedTextView) convertView).setChecked(isExpanded);
    return convertView;
  }

  @Override
  public boolean hasStableIds() {
    return false;
  }

  @Override
  public boolean isChildSelectable(int groupPosition, int childPosition) {
    return false;
  }
} 

This method doesn't work for me also (and I'm not sure why. My guess is that it will only work with Contnet providers). Instead of using notifyDataSetChanged() you can just requery/add new data to your groups and reset the adapter .

adapter = new MyExpandableListAdapter(getActivity(), groups);
listView.setAdapter(adapter);

your if statement is probably never called:

 if (termSelection.toString() == "Fall 2013")

should be

 if (termSelection.toString().equals("Fall 2013"))

EDIT:

== checks for object identity, when using Strings. you most probably mean equals instead.

Also i'd advise you to get familiar with the debugger and/or LogCat/Log.d(), this will save you tons of trouble;

您可以再次尝试设置列表适配器:

listView.setAdapter(adapter);

Try surrounding your notifysetchange with runOnUIThread(new Runnable(...)). Since you make a change with your listView it should be updated within your UI thread. Also a good way if you are not familiar with the breakpoints, try logging with your if statements and see if your conditions are set true.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM