1

我正在使用极其简单的 EndlessAdapter 从 Facebook 加载分页数据。在我的项目中EndlessAdapter,包装自定义BaseAdapter. 我也在使用PullToRefreshListView来自这个的一个。一切都加载正常,我得到了下一页加载的数据,我滚动到列表的底部,加载并填充了下一页数据,但是当我再次滚动到底部时,什么也没有发生。我对这些方法进行了日志检查,并且chacheInBackground()在第一次成功加载页面后根本没有运行。

我认为这可能与“拉动刷新”库和适配器无法检测到 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)然后导航回该片段,它将加载另一页数据。有任何想法吗?谢谢。

4

1 回答 1

3

答案在 Commonsware 的文档中清楚地说明了它EndlessAdapter是如何工作的:

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

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

于 2013-02-28T03:57:57.350 回答