2013-02-21 4 views
0

Facebook API를 사용하고 있으며 데이터를 표시하는 데 어려움을 겪고 있습니다. 내 코드는 조각을 사용하고 루트로 ListView을 가진 레이아웃을 부 풀린다. 그 ListView 수 있도록 다른 PullToRefreshListView 래핑됩니다. 또한 Mark Murphy의 Endless Adapter을 사용할 수 있도록 어댑터를 포장하고 있습니다. 조각을 만들기 전에 Facebook 데이터를 모두로드하면 모든 것이 작동합니다. 하지만 비어있는 조각을 만들고 싶습니다. ListView 그리고 Facebook 데이터를 비동기 적으로 가져 오면 채워 넣기를 원합니다.Facebook onComplete에서 setAdapter를 호출하는 중

나는 페이스 북 RequestonComplete(Response response) 콜백 메소드를 사용하고 있지만, 내가 어떤 이유로 onCreateView() 방법의 setAdapter(adapter) 외부에서 사용할 수없는 것으로 보인다. 나는 정말 간단한 것을 놓치고있는 것처럼 느껴진다. 이 코드는 이전에 실행

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

때문에

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); 
} 
+0

당신의 조각 코드입니까? onCompleted()에서 setAdapter를 호출 할 때 관찰 된 사항은 무엇입니까? 그냥 빈 목록? – sandrstar

+0

onCompleted()에서 setAdapter를 호출하면 빈 목록이 표시됩니다. 그러나 다른 단편으로 전환하고이 단편으로 돌아 가면 목록이 잘 채워집니다. else 문에있는 내용을 JSONException을 catch 한 후 줄과 동일하게 변경했습니다. 따라서 JSONArray가 onCompleted()에로드 되어도 동일한 메소드에서 setAdapter를 호출 할 수없는 것처럼 보입니다. – Wenger

답변

0

이런 일이 : onComplete를에

feedList.setAdapter(endlessAdapter); 

여기에 코드입니다. 원인은 initialFeedRequest.executeAsync();입니다. 요청이 UI-Thread 옆의 다른 스레드에서 실행됨을 의미합니다.

넣어 : onComplete는 반환 형식이 편집 View

때문에

와 다른 점은, 유 onViewCreate()에서보기를 반환해야 그 일을 한 후 유

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

을 실행해야 SharedPreference에 responseObjectonCopmlete :

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

다른 조건에 responseObject을 getback : 유 Application 클래스를 사용하려면

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 class tutorial

은 다음 U는 매니페스트를 변경해야합니다 :

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

</application> 
+0

감사합니다. 내가 집에 갈 때 나는 그것을 줄 것이다. 그건 의미가 있습니다. 내가보기를 반환 생각, 그냥 onCreateView() 전체 코드를 복사하지 않았다. – Wenger

+0

여전히 그 변화와 함께 나에게 똑같은 것을 준다. setAdapter 오른쪽 호출하기 전에 ListView inflate 할? – Wenger

+0

yes, u setAdapter를 호출하기 전에 ListView를 부풀려 야합니다. – Shoshi

관련 문제