在Facebook中的onComplete调用setAdapter [英] Calling setAdapter in Facebook onComplete

查看:179
本文介绍了在Facebook中的onComplete调用setAdapter的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用Facebook的API,我有一个很难得到一个的ListView 显示的数据。我的code使用碎片和膨胀,有一个的ListView 作为根布局。这的ListView 被包裹在另一个 PullToRefreshListView 启用的拉来刷新。我还包裹适配器,以便它可以使用马克·墨菲的无尽适配器。如果我在创建片段前加载所有Facebook数据,一切正常。但我想创建一个空的的ListView 片段,并填充它,一旦我得到Facebook的数据不同步。

我使用了的onComplete(响应响应)在Facebook的回调方法请求,但似乎我不能使用 setAdapter(适配器) onCreateView()方法之外的某些原因。我觉得我只是失去了一些东西很简单。这里的code:

  JSONArray新闻推送;
查看视图。
ListView的feedList;
PullToRefreshListView refreshFeedList;请求initialFeedRequest =新的请求(会话,我的/ home,空,HttpMethod.GET,新Request.Callback(){    @覆盖
    公共无效onCompleted(响应响应){
        Log.i(新闻源,初始加载的onComplete);
        Log.i(新闻推送,response.toString());
        responseObject = response.getGraphObject()getInnerJSONObject()。
        尝试{
            新闻源= responseObject.getJSONArray(数据);
        }赶上(JSONException E){
            e.printStackTrace();
        }
        feedAdapter =新FeedAdapter(getActivity(),Space.newsFeed);
        endlessAdapter =新EndlessFeed(feedAdapter);
        feedList.setAdapter(endlessAdapter);
        refreshFeedList.setOnRefreshListener(refreshListener);
        nextPageRequest = response.getRequestForPagedResults(PagingDirection.NEXT);
        字符串测试= feedAdapter.getItem(0)的ToString();
        Log.i(新闻推送,第一项:+测试);
    }
});公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,捆绑savedInstanceState){
    super.onCreateView(充气器,容器,savedInstanceState);
    鉴于= inflater.inflate(R.layout.news_feed,集装箱,FALSE);
    如果(feedAdapter == NULL){
        Log.i(新闻推送,执行请求);
        initialFeedRequest.executeAsync();
    }
    其他{
        feedAdapter =新FeedAdapter(getActivity(),Space.newsFeed);
        endlessAdapter =新EndlessFeed(feedAdapter);
        feedList.setAdapter(endlessAdapter);
        refreshFeedList.setOnRefreshListener(refreshListener);
    }
    refreshFeedList =(PullToRefreshListView)view.findViewById(R.id.feedList);
    feedList = refreshFeedList.getRefreshableView();
    feedList.setDividerHeight(0);
}


解决方案

这是发生,因为

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

这code为前执行:

  feedList.setAdapter(endlessAdapter);

在的onComplete。
因为你在呼吁 initialFeedRequest.executeAsync(); ,这意味着该请求是在UI线程旁边有一个不同的线程执行。 u必须执行

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

的onComplete 完成其工作。

和另外一件事,U应返回从 onViewCreate()视图,因为它的返回类型是查看

编辑:

把你的 responseObject 共享preference在 onCopmlete

 共享preferences preFS = preferenceManager.getDefaultShared preferences(getActivity());
共享preferences.Editor编辑器= prefs.edit();
editor.putString(responseObject,responseObject.toString());
editor.commit();

getback你的 responseObject 中的其他条件:

 的JSONObject responseObject;
共享preferences preFS = preferenceManager.getDefaultShared preferences(getActivity());
字符串responseObjectString = prefs.getString(responseObject);
如果(responseObjectString!= NULL)
    responseObject =新的JSONObject(responseObjectString);
新闻源= responseObject.getJSONArray(数据);feedAdapter =新FeedAdapter(getActivity(),新闻推送); //使用我们从SP获取新闻源
endlessAdapter =新EndlessFeed(feedAdapter);
feedList.setAdapter(endlessAdapter);
refreshFeedList.setOnRefreshListener(refreshListener);

如果ü要使用应用程序类,然后看到:
应用类教程

然后我只好也改变你的清单:

 <应用
   机器人:标签=@字符串/ APP_NAME
   机器人:allowBackup =真
   机器人:图标=@绘制/ ic_launcher
   机器人:名字=Your_Application_class_name。>
//其他组件。 ....< /用途>

I'm using the Facebook API and I'm having a hard time getting a ListView to show data. My code uses fragments and inflates a layout that has a ListView as the root. That ListView is wrapped in another PullToRefreshListView to enable Pull To Refresh. I'm also wrapping the adapter so it can use Mark Murphy's Endless Adapter. If I load all the Facebook data before creating the fragment, everything works. But I want to create the fragment with an empty ListView and populate it once I get the Facebook data asynchronously.

I'm using the onComplete(Response response) callback method in the Facebook Request, but it seems that I can't use setAdapter(adapter) outside of the onCreateView() method for some reason. I feel like I'm just missing something really simple. Here's the code:

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

解决方案

this is happening because

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

this code is executed before:

feedList.setAdapter(endlessAdapter);

in onComplete. cause u have called initialFeedRequest.executeAsync();, that means the request is executed in a different thread beside UI-Thread . u have to execute

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

after onComplete done its job

and another thing, u should return a view from onViewCreate() because its return type is View

Edited:

put your responseObject in SharedPreference in onCopmlete:

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

getback your responseObject in else condition:

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);

if u want to use Application class then see: Application class tutorial

then u have to change your manifest also:

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

</application>

这篇关于在Facebook中的onComplete调用setAdapter的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆