首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >列表片段内的截击

列表片段内的截击
EN

Stack Overflow用户
提问于 2015-04-21 19:12:55
回答 3查看 632关注 0票数 0

所以我有这个ListFragment,我想在onCreateView中运行volley请求。代码如下所示

代码语言:javascript
复制
@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没有填充提醒对象。有趣的是,只有当我用截击的时候才会发生。提前感谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-04-21 19:19:26

您需要在解析json数据之后调用adapter.notifyDataSetChanged();

根据android文档的说法,

notifyDataSetChanged() 通知附加的观察者基础数据已经更改,任何反映数据集的视图都应该刷新自己。

代码语言:javascript
复制
@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();
    }
票数 2
EN

Stack Overflow用户

发布于 2015-04-21 19:22:21

您的请求是异步的,因此响应很可能是在您已经将适配器设置为listview之后出现的。

不要在mReminderList中添加对象,而是在发出请求之前执行FeedAdapter,并在得到响应时将Reminder对象添加到FeedAdapter实例中。

在添加了所有的notifyDataSetChanged()之后,不要忘记在适配器上调用Reminders

票数 0
EN

Stack Overflow用户

发布于 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等操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29781135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档