ListFragment"内容视图尚未创建"分离后附上

时间:2016-01-18 13:42:27

标签: android android-fragments android-listfragment

我是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();
}

2 个答案:

答案 0 :(得分:1)

总结:

  1. 附加/分离不是刷新视图的正确方法
  2. 找到片段并调用刷新函数来更新内容
  3. setListShow - 不需要调用,默认情况下,列表是不可见的,直到调用setAdapter为止 - 如果有内容,它将变为可见。
  4. 如果适配器为空,也请调用setListAdapter。
  5. 要刷新列表,您不需要重新创建所有内容,只需更新适配器内容并调用invalidateDataSet函数。

答案 1 :(得分:0)

最后根据@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是我从ListFragment派生的片段类。但是当数据为空时,我仍然无法显示&#34; setEmptyText&#34;比如应用程序第一次运行时。