EndlessAdapter只加载一页

时间:2013-02-28 03:50:39

标签: android commonsware-cwac

我正在使用荒谬简单的EndlessAdapter从Facebook加载分页数据。在我的项目中EndlessAdapter包装自定义BaseAdapter。我还使用PullToRefreshListView来自library。一切都很好地启动,我得到下一页加载的数据,我滚动到列表的底部,下一页数据加载和填充,但当我再次滚动到底部时,没有任何反应。我对方法进行了日志检查,并且在第一次成功加载页面后,chacheInBackground()根本没有运行。

我认为这可能与“pull to refresh”库和适配器无法检测到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中的一个可点击内容),然后导航回来到这个片段,它将加载另一页数据。有任何想法吗?感谢。

1 个答案:

答案 0 :(得分:3)

答案显然是在Commonsware documentation中关于EndlessAdapter打算如何工作的答案:

  

您的EndlessAdapter子类也需要实现   cacheInBackground()。 (...)此方法返回一个布尔值   如果还有更多数据需要提取,则需要为true ,false   否则。

由于您总是从false返回cacheInBackground(),因此在第一次之后它永远不会再次运行。因此,当您滚动到底部时,它只会加载一次数据。