2014-07-24 1 views
0

Facebook SDK를 사용하는 Android 앱을 개발 중입니다.메소드에서 arraylist를 전역 필드로 가져옴

Facebook SDK를 사용하면 메서드에서 전역 필드로 arraylist 값을 얻을 수없는 특정 메서드를 사용해야합니다.

다음은 ListFragment 클래스

public class SelectionFragment extends ListFragment { 

    private static final String TAG = "SelectionFragment"; 
    public static final String PAGE_URL = "1438734076389483/feed"; 
    private static final int REAUTH_ACTIVITY_CODE = 100; 

    private static final String[] FROM = { "message", "crated_time", "likes" }; 
    private static final int[] TO = { R.id.feed_box, R.id.created_time, R.id.like_count }; 

    ArrayList<HashMap<String, String>> feedsList; 

    @Override 
    public void onAttach(Activity activity) { 
     Log.d(TAG, "onAttach method is called"); 
     feedsList = new ArrayList<HashMap<String,String>>(); 
     super.onAttach(activity); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     Log.d(TAG, "onCreateView method is called"); 
     //super.onCreateView(inflater, container, savedInstanceState); 

     // Check for an open session 
     final Session session = Session.getActiveSession(); 
     if (session != null && session.isOpened()) {    
      // Get the page's feed 
      makePageRequest(session); 
      Log.d(TAG, "makePageRequest method is called from onCreateView"); 
     } 

     SimpleAdapter adapter = new SimpleAdapter(getActivity() 
       .getBaseContext(), feedsList, R.layout.row, FROM, TO); 
     setListAdapter(adapter); 
     return super.onCreateView(inflater, container, savedInstanceState); 
    } 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     Log.d(TAG, "onCreate method is called"); 
     super.onCreate(savedInstanceState); 
     uiHelper = new UiLifecycleHelper(getActivity(), callback); 
     uiHelper.onCreate(savedInstanceState); 
    } 

    private void makePageRequest(final Session session) { 
     Log.d(TAG, "makePageRequest method is called"); 
     // Make an API call to get the page feed 
     // and define a new callback to handle the response. 
     new Request(session, PAGE_URL, null, HttpMethod.GET, new Request.Callback() { 
        public void onCompleted(Response response) { 
         if (session == Session.getActiveSession()) { 
          if (response != null) { 
           jSONToArrayList(response); 
          } 
         } 
         if (response.getError() != null) { 
          // Handle errors 
         } 
        } 
       }).executeAsync(); 
    } 

    public ArrayList<HashMap<String, String>> jSONToArrayList(
      Response facebookJSON) { 
     Log.d(TAG, "jSONToArrayList method is called");  
     ArrayList<HashMap<String, String>> dataList = new ArrayList<HashMap<String, String>>(); 
     JSONObject jSONGraphAPI; 
     JSONArray dataJSONArray; 
     int likeCount = 0; 
     String message = "", createdTime = ""; 

     try { 
      jSONGraphAPI = facebookJSON.getGraphObject().getInnerJSONObject(); 
      dataJSONArray = jSONGraphAPI.getJSONArray("data"); 

      for (int i = 0; i < dataJSONArray.length(); i++) { 
       JSONObject feedItem = dataJSONArray.getJSONObject(i); 
       if (feedItem.has("created_time") && feedItem.has("message")) { 
        message = feedItem.getString("message"); 
        createdTime = feedItem.getString("created_time"); 

        if (feedItem.has("likes")) { 
         JSONObject likes = feedItem.getJSONObject("likes"); 
         likeCount = likes.length(); 
        } 
        // Adding value HashMap key => value 
        HashMap<String, String> map = new HashMap<String, String>(); 
        map.put("message", message); 
        map.put("crated_time", createdTime); 
        map.put("likes", String.valueOf(likeCount)); 

        dataList.add(map); 
       } 
       // Reset the values to put another data on the HashMap 
       likeCount = 0; 
       message = ""; 
       createdTime = ""; 
      } 
     } catch (Exception e) { 
      Log.e(TAG, e.getMessage()); 
     } 
     feedsList = (ArrayList<HashMap<String, String>>) dataList.clone(); 
     Log.i("feedsList from jSONToArrayList method: ", feedsList.toString()); 
     return dataList; 
    } 
} 

내 어댑터에서 사용하는 feedsList입니다 내가 싶어 목록에서 내 코드입니다. 그러나 코드를 실행할 때마다 onCreateView 메서드에서 목록이 비어 있지만 makePageRequestjSONToArrayList 메서드로 가득 찼습니다. 여기 내 로그 캣에서의 모습입니다 :

D/SelectionFragment(32558): onAttach method is called 
D/SelectionFragment(32558): onCreate method is called 
D/SelectionFragment(32558): onCreateView method is called 

07-23 18:08:17.991: D/OpenGLRenderer(32558): Enabling debug mode 0 
07-23 18:08:18.001: D/SelectionFragment(32558): makePageRequest method is called 
07-23 18:08:19.221: D/SelectionFragment(32558): jSONToArrayList method is called 
07-23 18:08:19.221: I/feedsList from jSONToArrayList method:(32558): [{crated_time=2014-07-23T17:53:22+0000, message=test 123, likes=2}, {crated_time=2014-07-14T10:05:09+0000, message=hello, likes=0}] 
+0

: 당신이 요청에 executeAsync를 호출하지 않은 경우에 당신이 할 수 있었던 무엇

이있다. 그러면 어떻게 될까요? 또한 메소드 makepageRequest (Session) – Kode

+0

'onCreateView' 메소드는 복제를 통해리스트를 채우는'jSONToArrayList' 메소드를 호출하는'makePageRequest' 메소드를 호출합니다. 'makePageRequest'는 페이스 북 sdk가 http 요청을하기 위해 제공하는 메소드입니다. – Saf

답변

0

목록이 비어 이유 때문에 당신이 내부 클래스 인 Request 객체 내부의 목록을 jSONToArrayList를 호출하는. 따라서 대상의 수명은 makePageRequest의 수명에만 있습니다. 난 당신이 onCreateView 방법에 feedsList에 무엇을하고 볼 해달라고

private void makePageRequest(final Session session) { 
     Log.d(TAG, "makePageRequest method is called"); 
     // Make an API call to get the page feed 
     // and define a new callback to handle the response. 
    list = new Request(session, PAGE_URL, null, HttpMethod.GET, new Request.Callback() { 

      private ArrayList<HashMap<String, String>> getList() 
      { 
       return jSONToArrayList(response); 
      } 
        public void onCompleted(Response response) { 
         if (session == Session.getActiveSession()) { 
          if (response != null) { 
           jSONToArrayList(response); 
          } 
         } 
         if (response.getError() != null) { 
          // Handle errors 
         } 
        } 
       }).getList(); 
    } 
+0

고마워, 어쩌면 내가 자바 원리의 부족하지만, 나는 글로벌 필드에 값을 저장할 때, 목록은 여전히 ​​비어 있지 않을 것이라고 생각했다. 제게 해결책을 제안 해주세요. – Saf

+0

executeAsync()를 재정의 할 수 있습니까? – Kode

+0

이 방법은 페이스 북 SDK의 – Saf

관련 문제