2013-02-28 50 views
1

我使用荒謬簡單的EndlessAdapter從Facebook加載分頁數據。在我的項目EndlessAdapter包裝自定義BaseAdapter。我也使用PullToRefreshListView這是從library。一切都可以正常啓動,我得到下一頁加載數據,滾動到列表底部,加載和填充數據的下一頁,但是當我再次滾動到底部時,沒有任何反應。我有方法的日誌檢查和chacheInBackground()在第一次成功的頁面加載後根本不運行。EndlessAdapter只加載一頁

我認爲這可能與「拉刷新」庫和適配器無法檢測ListView位置或某事有關,所以我擺脫了「拉刷新」,仍然有同樣的問題。

下面是相關代碼:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    super.onCreateView(inflater, container, savedInstanceState); 
    view = inflater.inflate(R.layout.news_feed, container, false); 
    if(appState.getNewsFeed()==null){ 
     refreshListener.onRefresh(refreshFeedList); 
     Log.i("NewsFeed", "executing Request"); 
     if(appState.lastFeed().contains("lastFeed") && feedAdapter == null){ 
      try { 
       String lastFeedString = appState.lastFeed().getString("lastFeed", "null"); 
       JSONObject lastFeedObject = new JSONObject(lastFeedString); 
       JSONArray lastFeedArray; 
       lastFeedArray = lastFeedObject.getJSONArray("data"); 
       appState.setNewsFeed(lastFeedArray); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
      updateFeed(); 
     } 
    } 
    else{ 
     Log.i("NewsFeed", "recreating adapters from existing data"); 
     updateFeed(); 
    } 

    return view; 
} 

public void updateFeed(){ 
    refreshFeedList = (PullToRefreshListView) view.findViewById(R.id.feedList); 
    feedList = refreshFeedList.getRefreshableView(); 
    feedList.setDividerHeight(0); 
    feedAdapter = new FeedAdapter(getActivity(), appState.getNewsFeed()); 
    endlessAdapter = new EndlessFeed(feedAdapter); 
    refreshFeedList.setAdapter(endlessAdapter); 
    refreshFeedList.setOnRefreshListener(refreshListener); 
    refreshFeedList.setOnItemClickListener(itemClickListener); 
} 

public class EndlessFeed extends EndlessAdapter { 

    @Override 
    protected View getPendingView(ViewGroup parent) { 
     Log.i("NewsFeed", "running getPendingView()"); 
     View row = LayoutInflater.from(parent.getContext()).inflate(R.layout.loading_view, null); 
     return (row); 
    } 

    public EndlessFeed(BaseAdapter wrapped) { 
     super(wrapped); 
    } 

    @Override 
    protected boolean cacheInBackground() throws Exception { 
     Log.i("NewsFeed", "running cacheInBackground()"); 
     nextPageRequest.setCallback(nextPageCallback); 
     nextPageRequest.executeAndWait(); 
     return false; 
    } 

    @Override 
    protected void appendCachedData() { 
     try { 
      appState.addToNewsFeed(requestResponse); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
//   onDataReady(); 
    } 
} 

的JSONArray送入適配器保存爲在Application子getter和setter方法全局變量。

自從我重新創建適配器和調用setAdapter()onCreateView()方法,如果我(在ListView通過的可點擊的事情之一)更改爲不同的片段,然後再返回到該片段,它會載入另一頁數據。有任何想法嗎?謝謝。

回答

3

答案顯然是在Commonsware的documentationEndlessAdapter如何intented工作:

EndlessAdapter子類還需要實現 cacheInBackground()。 (...)此方法返回一個布爾值,,如果還有更多數據需要提取,則 需要爲真,否則爲假 。

由於您總是從cacheInBackground()返回false,所以在第一次後它將永遠不會再次運行。因此,當您滾動到底部時,它只會加載一次數據。

+0

Ahhh謝謝。我認爲,如果給定的頁面已經完成加載,你必須返回'false',而不是如果整個事情再也不需要加載更多的數據。 – Wenger 2013-02-28 04:32:49