2013-04-11 57 views
0

我已閱讀CWAC-endlessAdapter以及演示項目的所有文檔。我明白它是如何工作的,而且大多數情況下都是這樣。但是我有幾個問題想知道如何處理一些事情,我現在正在做這些事情(我還沒有找到任何工作的例子)。通過在對象中傳遞AsyncTask來實現EndlessAdapter []

下面是一個典型AsyncTask我使用(清理了一下):

class ReviewTask extends AsyncTask<String, String, Void> { 


     @Override 
     protected Void doInBackground(String... params) { 

      ArrayList<NameValuePair> param = new ArrayList<NameValuePair>(); 
      param.add(new BasicNameValuePair("username", userName)); 

      HttpClient httpClient = new DefaultHttpClient(); 
      HttpPost httpPost = new HttpPost(url_select); 

      try { 
       httpPost.setEntity(new UrlEncodedFormEntity(param)); 
       HttpResponse httpResponse = httpClient.execute(httpPost); 
       HttpEntity httpEntity = httpResponse.getEntity(); 
       is = httpEntity.getContent(); 

      } catch (Exception e) { 

      } 
      try { 
       BufferedReader br = new BufferedReader(
         new InputStreamReader(is)); 
       StringBuilder sb = new StringBuilder(); 
       String line = ""; 
       while ((line = br.readLine()) != null) { 
        sb.append(line + "\n"); 
       } 
       is.close(); 
       result = sb.toString(); 

      } catch (Exception e) { 

      } 
      return null; 
    } 

     protected void onPostExecute(Void v) { 

      String review, newdate, item, rating, cat; 
      try { 
       JSONArray jArray = new JSONArray(result); 
       JSONObject json_data = null; 
       for (int i = 0; i < jArray.length(); i++) { 
        json_data = jArray.getJSONObject(i); 
        newdate = json_data.getString("date"); 
        review = json_data.getString("review"); 
        item = json_data.getString("item"); 
        rating = json_data.getString("rating"); 
        cat = json_data.getString("category"); 


        reviews.add(review); 
        itemslist.add(item); 
        datelist.add(newdate); 
        ratings.add(rating); 
        cats.add(cat); 

       } 
      } 

      Profile[] p = new Profile[reviews.size()]; 
      int index = 0; 

      for (String i : reviews) { 
       p[index] = new Profile(reviews.get(index), datelist.get(index), 
         itemslist.get(index), ratings.get(index), 
         cats.get(index)); 
       index++; 
      } 

      if (getActivity() != null) { 
       adapter = new ProfileAdapter(getActivity(), p); 
       setListAdapter(adapter); 
      } 


     } 
    } 

在這種task,我從MySQL數據庫通過php的所有數據。我寫的SQL查詢立即收集所有數據。這是正確的仍然處理這種方式?

此外,我在ListFragmentonCreateView中將此任務稱爲。但它看起來像需要在cacheInBackground()中調用任務?

最後,這聽起來像我必須設置adapteronActivityCreated這樣的:

// from Example 
if (adapter==null) { 
    items=new ArrayList<Integer>(); 

    for (int i=0;i<25;i++) { items.add(i); } 

    adapter=new DemoAdapter(items); 
    adapter.setRunInBackground(false); 

} 
setListAdapter(adapter); 

我不明白或看到那裏是DemoAdapter(items)一個構造函數,並基於這樣的事實,我傳遞一個對象數組,我會做一些像DemoAdapter(object [])嗎?如果它爲空則可以,因爲收集數據實際上發生在適配器中,對嗎?

最後需要說明的是,我的所有適配器都位於設置它們的片段之外的類中。

回答

2

我寫的SQL查詢一次收集所有數據。這是正確的仍然處理這種方式?

這取決於你。但是,這樣做,您不需要EndlessAdapter,因爲您已經擁有了所有數據。 EndlessAdapter背後的要點是爲了支持你所做的情況,而不是而不是「一次收集所有數據」,而是希望收集一部分數據,並且只在用戶滾動得足夠的時候收集另一部分數據。

另外,我在我的ListFragment的onCreateView中調用這個任務。但它看起來像需要在cacheInBackground()中調用該任務?

這取決於你。如果你想用你自己的AsyncTask,只要你想,這很好。這是覆蓋在文檔中:

如果你寧願不EndlessAdapter運行其自己的AsyncTask,然後調用setRunInBackground(false)。在此模式下,將在主應用程序線程上調用您的cacheInBackground()方法。您可以自行安排後臺線程的工作,然後在想要更新適配器以反映新添加的數據時調用onDataReady()。請注意,在此場景中不會使用appendCachedData()

 

我不明白或看到那裏是DemoAdapter(項目)構造

沒有一個,作爲演示並不需要一個。

基於我傳遞一個對象數組的事實,我會做類似DemoAdapter(object [])的事情嗎?

這取決於你。

它可以,如果它爲空,因爲收集數據實際上發生在適配器中,正確嗎?

再有,就是給你。

然而,正如我前面所指出的,因爲你不需要EndlessAdapter,我建議你只是停止使用。

+0

感謝您的快速反應。其實,我確實需要這個適配器。我有很長的名單,我想分解,並希望被加載爲用戶滾動。所以這基本上意味着我必須一次只得到一定數量的行,例如「LIMIT 50」? – KickingLettuce 2013-04-11 19:57:31

+0

@KickingLettuce:是的,'LIMIT'和'OFFSET',或等效的。基本上,你的Web服務界面,您的數據庫後端需要支持「分頁」的結果(例如,「給我3頁」)。 – CommonsWare 2013-04-11 20:03:44