【问题标题】:ListFragment "Content view not yet created" after detach attach分离附加后ListFragment“尚未创建内容视图”
【发布时间】:2016-01-18 13:42:26
【问题描述】:

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

【问题讨论】:

  • 是的,不要使用分离刷新片段,附加。做findFragment,检查片段是否是正确的实例并调用刷新函数来更新内容。
  • @Raanan :谢谢,但请解释一下“检查片段是否是正确的实例”,如如何做到这一点?
  • if(fragment instanceof MyFragment) {... } 在您将其转换为 MyFragment 之前,您是如何做到的。

标签: android android-fragments android-listfragment


【解决方案1】:

总结一下:

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

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

【讨论】:

    【解决方案2】:

    根据@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 派生的片段类。但是当数据为空时,我仍然无法像应用第一次运行时那样显示“setEmptyText”。

    【讨论】:

    • 这是因为你在调用 setListShown(true);在 if 之外。
    • developer.android.com/reference/android/app/… - 应用程序通常不需要自己使用它。
    • 如果我不使用这个 setListShown(true),进度动画会继续旋转并且不显示空文本或数据(如果可用)
    • 我创建了一个答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-13
    • 2014-10-04
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多