0

所以我有這個ListFragment,我想在onCreateView裏面運行排除請求。代碼如下排在裏面的listfragment

@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沒有填充提醒對象。有趣的是,它只發生在我使用Volley的時候。提前致謝!

回答

2

您需要在解析json數據後調用adapter.notifyDataSetChanged();

作爲每android documentation

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

您的要求是異步的,所以它很可能的是,響應來後,你已經設置的適配器列表視圖。

而是將對象添加到mReminderList,比如你FeedAdapter發出請求,和Reminder對象添加到FeedAdapter實例時,你得到的迴應之前。
在添加完所有Reminders之後,請不要忘記在您的適配器上撥打notifyDataSetChanged()

0

嘗試添加項目到適配器後調用adapter.notifyDataSetChanged(),也動,你調用web服務的適配器之前設置適配器的代碼將是空的,當你嘗試調用notifyDataSetChanged()

而且這不是一個好主意即使在視圖的onCreateView()中的異步未被初始化直到控件從其返回時調用web服務或長操作。

移動你的凌空相關的代碼從onCreateView()onViewCreated()onActivityCreated()

只有在膨脹的onCreateView查看和findViewById等使用onViewCreated()getView()和設置適配器做ListView,後打電話給你的web服務。