0

Facebook API を使用していますが、ListViewデータを表示するのに苦労しています。ListView私のコードはフラグメントを使用し、ルートとしてを持つレイアウトを膨張させます。Pull To Refreshを有効にするためListViewに別のものにラップされます。Mark Murphy のEndless Adapterを使用できるように、アダプターもラッピングしています。フラグメントを作成する前にすべての Facebook データをロードすると、すべてが機能します。しかし、Facebook データを非同期で取得したら、空のフラグメントを作成してデータを入力したいと考えています。PullToRefreshListViewListView

onComplete(Response response)Facebookでコールバックメソッドを使っているのですが、なぜかメソッド外ではRequest使えないようです。本当に単純なものが欠けているような気がします。コードは次のとおりです。setAdapter(adapter)onCreateView()

JSONArray newsFeed;
View view;
ListView feedList;
PullToRefreshListView refreshFeedList;

Request initialFeedRequest = new Request(session, "me/home", null, HttpMethod.GET, new Request.Callback() {

    @Override
    public void onCompleted(Response response) {
        Log.i("NewsFeed", "initial load onComplete");
        Log.i("NewsFeed",response.toString());
        responseObject = response.getGraphObject().getInnerJSONObject();
        try {
            newsFeed = responseObject.getJSONArray("data");
        } catch (JSONException e) {
            e.printStackTrace();
        }
        feedAdapter = new FeedAdapter(getActivity(), Space.newsFeed);
        endlessAdapter = new EndlessFeed(feedAdapter);
        feedList.setAdapter(endlessAdapter);
        refreshFeedList.setOnRefreshListener(refreshListener);
        nextPageRequest = response.getRequestForPagedResults(PagingDirection.NEXT);
        String test = feedAdapter.getItem(0).toString();
        Log.i("NewsFeed", "First Item: " + test);
    }
});

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);
    view = inflater.inflate(R.layout.news_feed, container, false);
    if(feedAdapter==null){
        Log.i("NewsFeed", "executing Request");
        initialFeedRequest.executeAsync();
    }
    else{
        feedAdapter = new FeedAdapter(getActivity(), Space.newsFeed);
        endlessAdapter = new EndlessFeed(feedAdapter);
        feedList.setAdapter(endlessAdapter);
        refreshFeedList.setOnRefreshListener(refreshListener);
    }
    refreshFeedList = (PullToRefreshListView) view.findViewById(R.id.feedList);
    feedList = refreshFeedList.getRefreshableView();
    feedList.setDividerHeight(0);
}
4

1 に答える 1

0

これが起こっているのは

refreshFeedList = (PullToRefreshListView) view.findViewById(R.id.feedList);
feedList = refreshFeedList.getRefreshableView();
feedList.setDividerHeight(0);

このコードは次の前に実行されます。

feedList.setAdapter(endlessAdapter);

onComplete で。これは、リクエストがinitialFeedRequest.executeAsync();UI-Thread 以外の別のスレッドで実行されることを意味します。あなたは実行しなければなりません

refreshFeedList = (PullToRefreshListView) view.findViewById(R.id.feedList);
feedList = refreshFeedList.getRefreshableView();
feedList.setDividerHeight(0);

onComplete仕事を終えた後

もう1つonViewCreate()、戻り値の型がView

編集:

responseObjectあなたをSharedPreferenceに入れますonCopmlete

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
SharedPreferences.Editor editor = prefs.edit();
editor.putString("responseObject", responseObject.toString());
editor.commit();

他の条件であなたresponseObjectを取り戻します:

JSONObject responseObject;
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
String responseObjectString = prefs.getString("responseObject");
if(responseObjectString != null) 
    responseObject = new JSONObject(responseObjectString);
newsFeed = responseObject.getJSONArray("data");

feedAdapter = new FeedAdapter(getActivity(), newsFeed); // use the newsFeed we get from SP
endlessAdapter = new EndlessFeed(feedAdapter);
feedList.setAdapter(endlessAdapter);
refreshFeedList.setOnRefreshListener(refreshListener);

アプリケーション クラスを使用する場合は、次を参照してください: アプリケーション クラスのチュートリアル

次に、マニフェストも変更する必要があります。

<application 
   android:label="@string/app_name"
   android:allowBackup="true"
   android:icon="@drawable/ic_launcher"
   android:name=".Your_Application_class_name">
// other components. ....

</application>
于 2013-02-21T12:03:24.937 に答える