2012-11-12 6 views
0

안녕하세요 누군가가 이것 좀 봐 줄 수 있고 내가 어디로 잘못 갔는지 알고 있는지 볼 수 있습니다. GetTheMoreData()에서 GetTheMoreData 및 GetTheData의 항목을 목록보기에 추가하려고 할 때까지 게시물이 작업을 실행할 때까지 제대로 작동합니다. 더 많은로드 버튼을 클릭하면 오류가 발생하지 않으며 listview는 동일하게 유지됩니다. Postexecute는 로그의 데이터를 볼 수 있기 때문에 실행되지 않습니다. doInBackground()GetTheMoreData의 방법에서, 당신은 감사안드로이드, 자바 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 = 새 int [] {android.R.id.text1}; \t \t \t \t \t mAdapter = new SimpleAdapter (getActivity(), items, android.R.layout.simple_list_item_1, from, to); 하지만 로그를 볼 수있는 것처럼 그것은 백그라운드에서 실행되는 경우에도 listview가 동일하게 유지됩니다 – Guernica

+0

이것은 actionbarsherlock 내의 조각입니다. 조각 등이없는 기본 테스트를 만들었고 notifydatasetchanged 만 호출해도 문제가 없습니다. – Guernica

답변

3

그건 않기 때문에 :
List<Map<String, String>> items = new ArrayList<Map<String, String>>();
그래서 새 목록이 생성되고 만이 방법에 존재하고 목록에 요소를 추가하고이 아니다 귀하의 어댑터에 링크되어 있습니다.
이 줄 대신에 다음을 넣으십시오. items.clear();

+0

방금 ​​List > items = new ArrayList >(); 줄을 제거해야했습니다. notifyDataSetChanged()를 호출하면 제대로 작동하는 것 같습니다. – Guernica

+0

목록에있는 데이터를 바꾸거나 추가할지 여부를 알지 못했습니다. 나는 너를 도왔다 니 다행이다. – yDelouis

관련 문제