我正在使用荒谬简单的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
中的一个可点击内容),然后导航回来到这个片段,它将加载另一页数据。有任何想法吗?感谢。
答案 0 :(得分:3)
答案显然是在Commonsware documentation中关于EndlessAdapter
打算如何工作的答案:
您的
EndlessAdapter
子类也需要实现cacheInBackground()
。 (...)此方法返回一个布尔值 如果还有更多数据需要提取,则需要为true ,false 否则。
由于您总是从false
返回cacheInBackground()
,因此在第一次之后它永远不会再次运行。因此,当您滚动到底部时,它只会加载一次数据。