所以我有这个ListFragment,我想在onCreateView中运行volley请求。代码如下所示
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mView = inflater.inflate(R.layout.fragment_feed, container, false);
mFeedView = (ListView) mView.findViewById(android.R.id.list);
mNewPost = (FloatingActionButton) mView.findViewById(R.id.new_post);
mNewPost.setColorNormal(getResources().getColor(R.color.post_primary));
mNewPost.setColorPressed(getResources().getColor(R.color.post_pressed));
mNewPost.setColorRipple(getResources().getColor(R.color.post_rippled));
mNewPost.attachToListView(mFeedView);
mNewPost.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent newPost = new Intent(getActivity(), PostActivity.class);
newPost.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
getActivity().startActivity(newPost);
}
});
mReminderList = new ArrayList<Reminder>();
final JsonArrayRequest mRequest = new JsonArrayRequest(getFeedUrl(),
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
for (int i = 0; i < response.length(); i++){
try {
JSONObject mItem = response.getJSONObject(i);
Reminder mReminder = new Reminder();
mReminder.setFirstname(mItem.getString(TAG_FIRSTNAME));
mReminder.setLastname(mItem.getString(TAG_LASTNAME));
mReminder.setTitle(mItem.getString(TAG_TITLE));
mReminder.setContent(mItem.getString(TAG_CONTENT));
mReminderList.add(mReminder);
} catch (JSONException e){
e.printStackTrace();
}
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
NetworkUtils.getInstance(getActivity().getApplicationContext()).addToRequestQueue(mRequest);
mFeedAdapter = new FeedAdapter(this.getActivity(), mReminderList);
setListAdapter(mFeedAdapter);
return mView;
}适配器正常,JSON响应正常。问题是mReminderList没有填充提醒对象。有趣的是,只有当我用截击的时候才会发生。提前感谢!
发布于 2015-04-21 19:19:26
您需要在解析json数据之后调用adapter.notifyDataSetChanged();。
根据android文档的说法,
notifyDataSetChanged() 通知附加的观察者基础数据已经更改,任何反映数据集的视图都应该刷新自己。
@Override
public void onResponse(JSONArray response) {
for (int i = 0; i < response.length(); i++){
try {
JSONObject mItem = response.getJSONObject(i);
Reminder mReminder = new Reminder();
mReminder.setFirstname(mItem.getString(TAG_FIRSTNAME));
mReminder.setLastname(mItem.getString(TAG_LASTNAME));
mReminder.setTitle(mItem.getString(TAG_TITLE));
mReminder.setContent(mItem.getString(TAG_CONTENT));
mReminderList.add(mReminder);
} catch (JSONException e){
e.printStackTrace();
}
}
mFeedAdapter.notifyDataSetChanged();
}发布于 2015-04-21 19:22:21
您的请求是异步的,因此响应很可能是在您已经将适配器设置为listview之后出现的。
不要在mReminderList中添加对象,而是在发出请求之前执行FeedAdapter,并在得到响应时将Reminder对象添加到FeedAdapter实例中。
在添加了所有的notifyDataSetChanged()之后,不要忘记在适配器上调用Reminders。
发布于 2015-04-21 19:28:14
在将项添加到适配器后尝试调用adapter.notifyDataSetChanged(),也可以在调用webservice之前移动设置适配器的代码,当您尝试调用notifyDataSetChanged()时,适配器将为null。
而且,调用一个webservice或一个长操作也不是一个好主意,即使它在onCreateView() as View's中的异步在控件返回之前不会被初始化。
将与截取相关的代码从onCreateView()移动到onViewCreated()或onActivityCreated()
在调用webservice之后,只使用onCreateView中的getView()和ListView的set适配器来膨胀onViewCreated()中的视图和执行findViewById等操作。
https://stackoverflow.com/questions/29781135
复制相似问题