2014-01-24 46 views
-2

我有一個包含listView的片段,我希望在添加新記錄時進行更新。我試圖在片段中的onResume()中調用.notifyDataSetChanged(),但適配器= null。當調用notifyDataSetChanged()onResume時,adapter爲null()

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.fragment_log, 
      container, false); 

    exmaplePrefs = this.getActivity().getSharedPreferences(PREFS, 0); 
    json = exmaplePrefs.getString("jsonString", "cant find json"); 

    JSONObject MainObj = null; 
    JSONArray JsonArray = null; 

    try { 

     MainObj = new JSONObject(json); 
     JsonArray = MainObj.getJSONArray("Events"); 

      for(int i = 0; i < JsonArray.length(); i++){ 
       JSONObject c = JsonArray.getJSONObject(i); 

       // Storing JSON item in a Variable 
       String time = c.getString("time"); 
       String event = c.getString("event"); 
       String player = c.getString("player"); 

       String from[] = {"time","event", "player"}; 
       int to[] = {R.id.time,R.id.event, R.id.player}; 

       // Adding value HashMap key => value 
       HashMap<String, String> map = new HashMap<String, String>(); 
       map.put("time", time); 
       map.put("event", event); 
       map.put("player",player); 
       newItemlist.add(map); 
       listV=(ListView)rootView.findViewById(android.R.id.list); 
       adapter = new SimpleAdapter(getActivity(), newItemlist, R.layout.custom_list_row, from, to); 
       listV.setAdapter(adapter); 
      } 

    } catch (Exception e) { 
     // TODO: handle exception 
     System.out.print("ERROR"); 
    } 

    return rootView; 
} 
@Override 
public void onResume(){ 
    super.onResume(); 
    System.out.println("worked"); 

    if (adapter != null){ 
     adapter.notifyDataSetChanged();  
    } 
} 

我覺得這是值得做的適配器創建onCreateView(),是不可見的,當我回到片段。

回答

1

看着這個,我看到一些問題。

  1. 這對catch (Exception ex)來說通常是很差的做法。嘗試僅捕獲您擔心的特定異常,這會使修復問題更容易。
  2. 爲什麼你的ArrayAdapter是在for循環中創建的?你可能魔杖是這樣的:

    ArrayList list=new ArrayList(); //Specify what type of value is in the ArrayAdapter 
    adapter = new SimpleAdapter(getActivity(), newItemlist, R.layout.custom_list_row,list); 
    listV.setAdapter(adapter); 
    MainObj = new JSONObject(json); 
    JsonArray = MainObj.getJSONArray("Events"); 
    
    for(int i = 0; i < JsonArray.length(); i++){ 
        JSONObject c = JsonArray.getJSONObject(i); 
    
        // Storing JSON item in a Variable 
        String time = c.getString("time"); 
        String event = c.getString("event"); 
        String player = c.getString("player"); 
    
        String from[] = {"time","event", "player"}; 
        int to[] = {R.id.time,R.id.event, R.id.player}; 
    
        // Adding value HashMap key => value 
        HashMap<String, String> map = new HashMap<String, String>(); 
        map.put("time", time); 
        map.put("event", event); 
        map.put("player",player); 
        newItemlist.add(map); 
        listV=(ListView)rootView.findViewById(android.R.id.list); 
        adapter.add(map); 
    } 
    

我不太清楚SimpleArrayAdapter是什麼,但你要在循環外部一次創建一個新的,並添加東西給它的循環內最有可能的是,重新創建它似乎是一個糟糕的選擇。特別是你可能需要做一些特殊的adapter.add(map)命令,但這種一般模式應該有所幫助。你還需要到ArrayList list更改爲類似ArrayList<String> list=new ArrayList<String>(),到無論你是ArrayAdapter存儲(貌似HashMap<String,String>

+0

我已經做了一些更改,因爲您建議適配器不再爲空...但是,它只包含數據,如果調用onCreateView()。即newItemlist –

+0

仔細查看片段的生命週期,並決定在哪個點您需要初始化arrayAdapter。然後在那裏初始化它。 – PearsonArtPhoto

1

如果拋出一個Exception,您將直接移動到catch塊,因此跳過adapter的初始化。這可能意味着解析您的JSON字符串時出現錯誤。

+0

我已經測試了這一點,它從來沒有碰到異常 –

+0

如果方向改變適配器更新爲onCreateView( )被再次調用。我希望這會自動發生 –

相關問題