Tampilan Konten ListFragment belum dibuat setelah pelepasan lampiran

Saya baru dalam pemrograman Android. Saya mencoba ListFragment yang diisi dari database, dan berfungsi dengan baik.
Saya dapat menampilkan nilainya, tetapi ketika saya mencoba menyegarkan tampilan dengan melepaskan dan melampirkan fragmen lagi, muncul kesalahan tampilan konten yang belum dibuat di getListView() yang saya pakai onActivityCreated.
Ada ide?

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

ketika saya mencoba menyegarkan fragmen

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 sumber
comment
Ya, jangan menyegarkan sebuah fragmen dengan menggunakan detach, lampirkan. Lakukan findFragment, periksa apakah fragmen tersebut adalah instance yang benar dan panggil fungsi penyegaran yang hanya akan memperbarui konten.   -  person Raanan    schedule 18.01.2016
comment
@Raanan: terima kasih, tapi tolong jelaskan tentang memeriksa apakah fragmen tersebut adalah contoh yang benar seperti bagaimana cara melakukannya?   -  person saintfalcon    schedule 18.01.2016
comment
if(fragment instanceof MyFragment) {... } sebelum Anda mentransmisikannya ke MyFragment, persis seperti yang Anda lakukan.   -  person Raanan    schedule 18.01.2016


Jawaban (2)


Untuk meringkas:

  1. Lampirkan/Lepaskan bukanlah cara yang tepat untuk menyegarkan tampilan
  2. temukan Fragmen dan panggil fungsi penyegaran untuk memperbarui konten
  3. setListShow - tidak perlu dipanggil, daftar secara default tidak terlihat sampai panggilan ke setAdapter dilakukan - kemudian jika ada konten maka akan terlihat.
  4. Panggil juga setListAdapter jika adaptornya kosong.

Untuk menyegarkan daftar, Anda tidak perlu membuat ulang semuanya, cukup perbarui konten adaptor dan panggil fungsi invalidateDataSet.

person Raanan    schedule 18.01.2016

Akhirnya mendapatkan sesuatu yang benar (menurut saya) berdasarkan saran dari @Raanan yaitu membuat fungsi untuk mengisi daftar dan dapat dipanggil saat diperlukan.

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

dan metode penyegarannya adalah

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

ScreenContact adalah kelas fragmen saya yang berasal dari ListFragment. tapi tetap saja ketika datanya kosong, saya masih tidak bisa menampilkan "setEmptyText" seperti saat aplikasi pertama kali dijalankan.

person saintfalcon    schedule 18.01.2016
comment
itu karena Anda memanggil setListShown(true); di luar jika. - person Raanan; 18.01.2016
comment
developer.android.com/reference/android/app/ - Aplikasi biasanya tidak perlu menggunakan ini sendiri. - person Raanan; 18.01.2016
comment
jika saya tidak menggunakan setListShown(true) ini, animasi kemajuan terus berputar dan tidak menampilkan teks kosong atau data (jika tersedia) - person saintfalcon; 18.01.2016
comment
Saya membuat jawaban. - person Raanan; 18.01.2016