在Facebook中的onComplete调用setAdapter [英] Calling setAdapter in Facebook onComplete
问题描述
我使用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屋!