1

Facebook からページングされたデータをロードするために、とてつもなく単純な EndlessAdapter を使用しています。私のプロジェクトではEndlessAdapter、カスタムをラップしますBaseAdapterPullToRefreshListViewこのライブラリの a も使用しています。すべてが正常にロードされて起動し、次のページのロード用のデータを取得し、リストの一番下までスクロールすると、データの次のページがロードされて入力されますが、もう一度一番下までスクロールしても何も起こりません。メソッドのログ チェックがあり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()メソッドを呼び出すので、別のフラグメントに ( のクリック可能なものの 1 つを介してListView) 変更し、このフラグメントに戻ると、別のページのデータが読み込まれます。何か案は?ありがとう。

4

1 に答える 1

3

答えは、 がどのように機能するかについてのCommonsware のドキュメントEndlessAdapterに明確に記載されています。

サブクラスEndlessAdapterも実装する必要があります cacheInBackground()。(...) このメソッドはブール値を返します。これは、まだフェッチされていないデータがある場合は true である必要があり、それ以外の場合は false です。

あなたは常にfalseから戻ってくるのでcacheInBackground()、最初の 2 回目以降は二度と実行されません。したがって、一番下までスクロールすると、さらに多くのデータが 1 回だけ読み込まれます。

于 2013-02-28T03:57:57.350 に答える