มุมมองเนื้อหา ListFragment ยังไม่ได้สร้างหลังจากแยกการแนบ

ฉันใหม่ในการเขียนโปรแกรม Android ฉันลองใช้ ListFragment ที่เติมจากฐานข้อมูล และทำงานได้ดี
ฉันสามารถแสดงค่าได้ แต่เมื่อฉันพยายามรีเฟรชมุมมองโดยการถอดและแนบแฟรกเมนต์อีกครั้ง กลับได้รับมุมมองเนื้อหาข้อผิดพลาดที่ยังไม่ได้สร้างบน getListView() ซึ่งฉัน ใส่ onActivityCreated
มีไอเดียบ้างไหม

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

person saintfalcon    schedule 18.01.2016    source แหล่งที่มา
comment
ใช่ ไม่ต้องรีเฟรชแฟรกเมนต์โดยใช้การแยกส่วน แนบ ทำ findFragment ตรวจสอบว่าแฟรกเมนต์เป็นอินสแตนซ์ที่ถูกต้องหรือไม่ และเรียกใช้ฟังก์ชันรีเฟรชซึ่งจะอัปเดตเนื้อหา   -  person Raanan    schedule 18.01.2016
comment
@Raanan: ขอบคุณ แต่โปรดอธิบายเกี่ยวกับการตรวจสอบว่าแฟรกเมนต์เป็นตัวอย่างที่ถูกต้องหรือไม่ วิธีการทำเช่นนั้น   -  person saintfalcon    schedule 18.01.2016
comment
if(fragment instanceof MyFragment) {... } ก่อนที่คุณจะส่งมันไปที่ MyFragment ว่าคุณทำได้อย่างไร   -  person Raanan    schedule 18.01.2016


คำตอบ (2)


สรุป:

  1. การแนบ/แยกออกไม่ใช่วิธีที่ถูกต้องในการรีเฟรชมุมมอง
  2. ค้นหา Fragment และเรียกใช้ฟังก์ชันรีเฟรชเพื่ออัปเดตเนื้อหา
  3. setListShow - ไม่จำเป็นต้องถูกเรียก โดยค่าเริ่มต้นรายการจะมองไม่เห็นจนกว่าจะมีการเรียก setAdapter - จากนั้นหากมีเนื้อหา รายการนั้นก็จะมองเห็นได้
  4. เรียก setListAdapter ด้วยหากอะแด็ปเตอร์ว่างเปล่า

หากต้องการรีเฟรชรายการ คุณไม่จำเป็นต้องสร้างทุกอย่างใหม่ เพียงแค่อัปเดตเนื้อหาอะแดปเตอร์และเรียกใช้ฟังก์ชัน invalidateDataSet

person Raanan    schedule 18.01.2016

ในที่สุดก็มีสิ่งที่ถูกต้อง (ฉันคิดว่า) ตามคำแนะนำของ @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" เหมือนตอนที่แอปทำงานครั้งแรกได้

person saintfalcon    schedule 18.01.2016
comment
เป็นเพราะคุณกำลังเรียก setListShown(true); ภายนอกถ้า - person Raanan; 18.01.2016
comment
developer.android.com/reference/android/app/ - ปกติแล้วแอปพลิเคชันไม่จำเป็นต้องใช้สิ่งนี้เอง - person Raanan; 18.01.2016
comment
ถ้าฉันไม่ได้ใช้ setListShown(true) นี้ แอนิเมชั่นความคืบหน้าจะหมุนต่อไปและไม่แสดงข้อความว่างหรือข้อมูล (ถ้ามี) - person saintfalcon; 18.01.2016
comment
ฉันสร้างคำตอบ - person Raanan; 18.01.2016