2013-04-25 66 views
9

我正在使用Fragments創建聯繫人列表應用程序,其中一個frag是聯繫人列表中的名稱列表,另一個是其餘細節。刷新ArrayAdapter onResume [notifyDataSetChanged()不工作]

這裏是顯示名稱的列表

public class MyListFragment extends ListFragment { 

private ContactStorage contactStorage = new ContactStorage(); 

public final static String TAG = "FRAGMENTS"; 
private MainActivity parent; 
ArrayAdapter<String> adapter; 

ArrayList<String> entries = new ArrayList<String>(); 

String array[]; 

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    View v = inflater.inflate(R.layout.list_layout, null); 
    parent = (MainActivity) getActivity(); 
    entries = contactStorage.getContactListNames(); 

    adapter = new ArrayAdapter<String>(getActivity().getApplicationContext(), 
      android.R.layout.simple_list_item_1, entries); 

    setListAdapter(adapter); 
    Log.d(TAG, "Adapter created"); 
    array = contactStorage.getContactDetails(); 
    return v; 

} 

@Override 
public void onResume() { 

    super.onResume(); 
    entries = contactStorage.getContactListNames(); 
    adapter.notifyDataSetChanged(); 
    Log.d(TAG, "List Frag Resumed"); 

} 
} 

我遇到的問題是,一個ArrayAdapter不會在簡歷刷新類。

當屏幕旋轉時,它的罰款作爲onCreateView()再次運行,但我需要它刷新onResume。我已經看過這個網站的負載,但沒有發現,但「使用notifyDataSetChanged()」不起作用。

+0

好了,你有什麼期待?您正在檢索「條目」,但不會重新構建您的「適配器」。將'entires ='和'adapter ='這兩行從'onCreate()'移動到'onResume()'(你應該只做一次),'onResume()'忘記'entries ='和'notify''你會沒事的。 – 2013-04-25 16:16:11

+0

@ClassStacker - 仍然是同樣的問題。在屏幕旋轉之前不刷新列表。 – RockJake28 2013-04-25 16:19:46

+0

嗯,是的,對不起,你還必須在那裏做setListAdapter()。 – 2013-04-25 16:23:02

回答

29

您遇到的問題是您覆蓋了條目引用,並且它沒有在適配器上發生變化。這裏是你如何解決這個問題

@Override 
public void onResume() { 

    super.onResume(); 
    entries.clear(); 
    entries.addAll(contactStorage.getContactListNames()); 
    adapter.notifyDataSetChanged(); 
    Log.d(TAG, "List Frag Resumed"); 

} 

這是一個常見的錯誤之作,它造成的,因爲當你第一次創建一個列表(在內存中)和你的entries場點,你再告訴adapter看在創建內存位置時,但您在內存中創建一個新列表(當您再次獲取聯繫人列表名稱時),並告訴條目指向內存中的新列表時,您需要做的是將內存中的條目替換包含新列表中條目的原始列表,那樣adapter仍然會引用相同的列表。

+0

完美!我知道這與'.add()'有關,但我無法在這個話題上得到明確的答案。非常感謝你! – RockJake28 2013-04-25 16:24:23

+1

我也加了一個關於這個問題的更好的解釋。另一種可以用你的ArrayAdapter實現的方法是恢復'adapter.clear();'然後'adapter.addAll(contactStorage.getContactListNames());'並且只是忘記所有的條目字段。 – Eluvatar 2013-04-25 16:25:56

+0

感謝隊友,addAll做到了神奇;) – Salmaan 2015-04-10 20:14:53

4

notifyDataSetChanged()將不適用於您。原因爲什麼

您的適配器失去對您的列表的引用。當你第一次初始化Adapter時,它會引用你的arrayList並傳遞給它的父類。但是,如果你重新初始化現有的ArrayList它losts與適配器:(參考因此,通信信道

始終創建並添加一個新的列表適配器這樣做:。

  1. 初始化ArrayList中而全球範圍內宣佈。
  2. 添加列表中直接向適配器進行檢查空和空 狀況。直接將適配器列表(不檢查任何 條件)。適配器給你保證,無論你在哪裏 改變數據的arrayList它會照顧,但不會鬆動 參考。
  3. 將數據添加到arrayList每次(如果您的數據是全新的 比您可以調用adapter.clear()和arrayList.clear()之前 實際將數據添加到列表中),但不要設置適配器即如果 新的數據填充ArrayList中不僅僅是 adapter.notifyDataSetChanged()

守信用,以之證件

相關問題