2012-11-12 125 views
0

嗨,有人可以看看這個,看看他們是否知道我錯了什麼地方請。它工作正常,直到後執行GetTheMoreData()中的任務,即時試圖將來自GetTheMoreData和GetTheData的條目追加到列表視圖。當我點擊加載更多的按鈕,我沒有得到任何錯誤和列表視圖保持不變。 Postexecute會啓動,因爲我可以看到日誌中的數據。感謝Android,java listview notifyDataSetChanged();不工作

SimpleAdapter mAdapter; 
String mCurFilter; 
List<Map<String, String>> items = new ArrayList<Map<String, String>>(); 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

    String letter = getActivity().getIntent().getStringExtra("LETTER"); 
    new GetTheData().execute(letter); 

    final ListView lv = getListView(); 
    Button btnLoadMore = new Button(getActivity()); 
    btnLoadMore.setText("Load More"); 
    lv.addFooterView(btnLoadMore); 
    lv.setTextFilterEnabled(true);   
    btnLoadMore.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View arg0) { 
      new GetTheMoreData().execute("A"); 
      Log.i(TAG, "loadmore clicked : "); 
     } 
    }); 

    lv.setOnItemClickListener(new OnItemClickListener() {  
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      //room for stuff    
     } 
    }); 
    setListShown(false); 
    getLoaderManager().initLoader(0, null, this); 
} 

private class GetTheMoreData extends AsyncTask<String, Void, List<Map<String, String>>> { 
    @Override 
    protected List<Map<String, String>> doInBackground(String... res) {  
     List<Map<String, String>> items = new ArrayList<Map<String, String>>(); 
     start = start +25; 
     JSONObject json = JSONfunctions.getJSONfromURL("http://www.myurl.com/main.php?letter="+res[0]+"&start="+start);   
     try{ 
      JSONArray songlist = json.getJSONArray("mainlist");     
      for(int i=0;i<songlist.length();i++){      
       HashMap<String, String> map = new HashMap<String, String>();  
       JSONObject e = songlist.getJSONObject(i);   
       map.put("id", String.valueOf(i)); 
       map.put("Item", e.getString("Item"));    
       items.add(map); 
       Log.i(TAG, "dat:" + items); 
      }  
     }catch(JSONException e)  { 
      Log.e("log_tag", "Error parsing data "+e.toString()); 
     }   
     return items; 
    } 

    @Override 
    protected void onPostExecute(List<Map<String, String>> items) { 

     mAdapter.notifyDataSetChanged(); 
     super.onPostExecute(items); 
    } 

    @Override 
    protected void onProgressUpdate(Void... values) { 
     // TODO Auto-generated method stub 
     super.onProgressUpdate(values); 
    } 
} 

private class GetTheData extends AsyncTask<String, Void, List<Map<String, String>>> { 
    @Override 
    protected List<Map<String, String>> doInBackground(String... res) {   
     JSONObject json = JSONfunctions.getJSONfromURL("http://www.myurl.com/main.php?letter="+res[0]+"&start=0");   
     try{ 
      JSONArray songlist = json.getJSONArray("mainlist"); 

      for(int i=0;i<songlist.length();i++){      
       HashMap<String, String> map = new HashMap<String, String>();  
       JSONObject e = songlist.getJSONObject(i);   
       map.put("id", String.valueOf(i)); 
       map.put("Item", e.getString("Item")); 
       items.add(map);   
      }  
     }catch(JSONException e)  { 
      Log.e("log_tag", "Error parsing data "+e.toString()); 
     }   
     return items; 
    } 

    @Override 
    protected void onPostExecute(List<Map<String, String>> items) { 
     String[] from = new String[] { "Item" }; 
     int[] to = new int[] { android.R.id.text1 }; 

     mAdapter = new SimpleAdapter(getActivity(), items, 
       android.R.layout.simple_list_item_1, from, to); 
     setListAdapter(mAdapter); 
     super.onPostExecute(items); 
    } 

    @Override 
    protected void onProgressUpdate(Void... values) { 
     super.onProgressUpdate(values); 
    } 
} 

@Override 
public void onListItemClick(ListView l, View v, int position, long id) { 
    switch(position) 
    {} 

    Log.i(TAG, "Item clicked: " + id); 
} 

// These are the rows that we will retrieve. 
public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
    // mAdapter.swapCursor(data); 

    // The list should now be shown. 
    if (isResumed()) { 
     setListShown(true); 
    } else { 
     setListShownNoAnimation(true); 
    } 
} 

public void onLoaderReset(Loader<Cursor> loader) { 
    // mAdapter.swapCursor(null); 
} 

@Override 
public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) { 
    // TODO Auto-generated method stub 
    return null; 
} 
+0

它看起來像你從來沒有將新的數據添加到適配器..你不想在調用notifyDataSetChanged()之前將項目添加到適配器? – Joel

+0

以及我試圖通過添加\t String [] from = new String [] {「Item1」}; int [] to = new int [] {android.R.id.text1};我們可以通過下面的例子來說明如何使用SimpleAdapter(getActivity(),items,android.R.layout.simple_list_item_1,from,to);但列表視圖保持不變,雖然它在後臺運行,我可以看到日誌 – Guernica

+0

這是一個片段內actionbarsherlock我做了一個基本的測試沒有片段等,它工作正常,只調用notifydatasetchanged。 – Guernica

回答

3

這是因爲在doInBackground()GetTheMoreData的方法,這樣做:
List<Map<String, String>> items = new ArrayList<Map<String, String>>();
所以創建一個新的服務,您要添加元素只存在於這種方法,並且列表不鏈接到您的適配器。
而不是這條線,把這個:items.clear();

+0

我只需要刪除行List > items = new ArrayList >();並調用notifyDataSetChanged(),它似乎工作。 – Guernica

+0

我不知道是否要替換或添加列表中的數據。我很高興幫助你。 – yDelouis

相關問題