2016-01-18 3 views
0

Я новичок в программировании для Android. Я попробовал ListFragment, заполненный из базы данных, и он работает хорошо.
Я мог отображать значения, но когда я пытаюсь обновить представление, отделив и присоединяя фрагмент снова, получилось представление содержимого ошибки, еще не созданное на getListView(), которое я надел onActivityCreated.
Любые идеи?ListFragment «Просмотр содержимого еще не создан» после отсоединения

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

Да, не обновляйте фрагмент с помощью отсоединения, прикрепите. Найдите findFragment, проверьте, является ли фрагмент правильным экземпляром и вызывает функцию обновления, которая будет просто обновлять содержимое. – Raanan

+0

@ Raanan: спасибо, но, пожалуйста, объясните, «проверьте, является ли фрагмент правильным экземпляром», как в том, как это сделать? – saintfalcon

+0

if (фрагмент instanceof MyFragment) {...} перед тем, как передать его в MyFragment, точно, как вы это сделали. – Raanan

ответ

1

Резюмируя:

  1. Attach/Detach не является правильным способом освежить вид
  2. найти фрагмент и вызвать функцию обновления, чтобы обновить содержимое
  3. setListShow - не нужно для вызова список по умолчанию невидим до тех пор, пока не будет сделан вызов setAdapter - тогда, если есть контент, он станет видимым.
  4. Вызовите setListAdapter также, если адаптер пуст.

Чтобы обновить список, вам не нужно обновлять все, просто обновляя содержимое адаптера и вызывая функцию invalidateDataSet.

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. но все же, когда данные пустые, я все еще не могу показать «setEmptyText», как при первом запуске приложения.

+0

это потому, что вы вызываете setListShown (true); вне if. – Raanan

+0

http://developer.android.com/reference/android/app/ListFragment.html#setListShown(boolean) - Приложения обычно не должны использовать это сами. – Raanan

+0

Если я не использую этот setListShown (true), анимация прогресса продолжает вращаться и не показывает пустой текст или данные (если есть) – saintfalcon