分离附加后的 ListFragment "Content view not yet created"

ListFragment "Content view not yet created" after detach attach

我是 android 编程新手。 我尝试从数据库中填充 ListFragment,它运行良好。
我可以显示这些值,但是当我尝试通过再次分离和附加片段来刷新视图时,在我放在 onActivityCreated 上的 getListView() 上出现错误内容视图尚未创建。
有什么想法吗?

public void onActivityCreated(Bundle savedInstanceState) {
  super.onActivityCreated(savedInstanceState);
  listView = getListView();

  db = new DatabaseAccess(getActivity().getApplicationContext());
  List<Contact> contacts = db.getAllContacts();

  if (contacts.size() > 0) {
    List<Map<String, String>> contactList = new ArrayList<Map<String, String>>();
    for (Contact con : contacts) {
      Map<String, String> data = new HashMap<String, String>(2);
      data.put("name", con.getName());
      data.put("number", con.getNumber());
      contactList.add(data);
    }
    SimpleAdapter adapter = new SimpleAdapter(getView().getContext(), contactList, android.R.layout.simple_list_item_2, new String[] {"name", "number"}, new int[] {android.R.id.text1, android.R.id.text2});

    listView.setAdapter(adapter);
  } else {
    setEmptyText("Masih belum ada kontak");
  }
  setListShown(true);
  db.closeDB();
}

当我尝试刷新片段时

void refreshFragment() {
  Fragment frg = getFragmentManager().findFragmentById(R.id.fragment);
  FragmentTransaction fragTransaction = this.getFragmentManager().beginTransaction();
  fragTransaction.detach(frg);
  fragTransaction.attach(frg);
  fragTransaction.commit();
}

根据@Raanan 的建议,终于找到了正确的东西(我认为),它正在制作一个函数来填充列表,并且可以在需要时调用。

@Override
public void onActivityCreated(Bundle savedInstanceState) {
  super.onActivityCreated(savedInstanceState);
  listView = getListView();
  populateList(listView);
}

void populateList(ListView lv) {
  db = new DatabaseAccess(getActivity().getApplicationContext());
  List<Contact> contacts = db.getAllContacts();

  if (contacts.size() > 0) {
    List<Map<String, String>> contactList = new ArrayList<Map<String, String>>();
    for (Contact con : contacts) {
      Map<String, String> data = new HashMap<String, String>(2);
      data.put("name", con.getName());
      data.put("number", con.getNumber());
      contactList.add(data);
    }
    SimpleAdapter adapter = new SimpleAdapter(getView().getContext(), contactList, android.R.layout.simple_list_item_2, new String[] {"name", "number"}, new int[] {android.R.id.text1, android.R.id.text2});

    lv.setAdapter(adapter);
  } else {
    setEmptyText("Masih belum ada kontak");
  }
  setListShown(true);
  db.closeDB();
}

刷新方式为

void refreshFragment() {
  Fragment frg = getFragmentManager().findFragmentById(R.id.fragment);
  if (frg instanceof ScreenContact) {
    ((ScreenContact) frg).populateList(((ScreenContact) frg).getListView());
  }
}

ScreenContact 是我的片段 class 派生自 ListFragment。但是当数据为空时,我仍然无法像应用程序第一次 运行.

时那样显示 "setEmptyText"

总结:

  1. Attach/Detach 不是刷新视图的正确方法
  2. 找到 Fragment 并调用刷新函数来更新内容
  3. setListShow - 不需要调用,默认情况下列表是不可见的,直到调用 setAdapter - 然后如果有内容它将变得可见。
  4. 如果适配器为空,也调用 setListAdapter。

要刷新列表,您不需要重新创建所有内容,只需更新适配器内容并调用 invalidateDataSet 函数即可。