本文介绍了notifyDataSetChanged()无法更新适配器onClick的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在ExpandableListViews上跟踪本教程.我希望我的实现显示点击按钮后添加的新值.但是,我没有尝试过.除了尝试使用notifyDataSetChanged()之外,我还尝试了notifyDataSetInvalidated()并实例化一个新的适配器,这在类似的文章中有所建议.未显示的新数据在我的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) {
        }
    }
}

我的自定义适配器:

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;
  }
}

推荐答案

此方法也不适用于我(我不确定为什么.我的猜测是它仅适用于Contnet提供程序).除了使用notifyDataSetChanged(),您还可以将新数据重新查询/添加到groups并重置adapter.

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);

这篇关于notifyDataSetChanged()无法更新适配器onClick的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

06-26 19:04