2013-11-02 45 views
2

我正在製作一個3片段頁面應用程序,它的第一個片段是從http加載json,但是當我轉到fragment3並返回到fragment1時,它將消失並從http再次加載它。我如何正確設置片段中的保存/恢復狀態。Android如何豐富arraylist

片段1代碼:

public class Fragment1 extends Fragment { 
private ArrayList<FeedItem> feedList = null; 
    private ProgressBar progressbar = null; 
    private ListView feedListView = null; 



    @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.activity_post_list, container, false); 

     progressbar = (ProgressBar)rootView.findViewById(R.id.progressBar); 
     String url = ""; 
     new DownloadFilesTask().execute(url); 
    return rootView; 


    } 


    public void updateList() { 
     feedListView= (ListView)getActivity().findViewById(R.id.custom_list); 

     feedListView.setVisibility(View.VISIBLE); 
     if (progressbar.isShown()) { 
      progressbar.setVisibility(View.GONE); 
     } 


     feedListView.setAdapter(new CustomListAdapter(getActivity(), feedList)); 
     feedListView.setOnItemClickListener(new OnItemClickListener() { 



       @Override 
       public void onItemClick(AdapterView<?> a, View v, int position, long id) { 
         Object o = feedListView.getItemAtPosition(position); 
         FeedItem newsData = (FeedItem) o; 


         Intent intent = new Intent(getActivity(), FeedDetailsActivity.class); 
         intent.putExtra("feed", newsData); 
         startActivity(intent); 
       } 
     }); 
     } 

     public class DownloadFilesTask extends AsyncTask<String, Integer, Void> { 

     @Override 
     protected void onProgressUpdate(Integer... values) { 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
       if (null != feedList) { 
         updateList(); 
       } 
     } 

     @Override 
     protected Void doInBackground(String... params) { 
       String url = params[0]; 

       // getting JSON string from URL 
       JSONObject json = getJSONFromUrl(url); 

       //parsing json data 
       parseJson(json); 
       return null; 
     } 
     } 


     public JSONObject getJSONFromUrl(String url) { 
     InputStream is = null; 
     JSONObject jObj = null; 
     String json = null; 

     // Making HTTP request 
     try { 
       // defaultHttpClient 
       DefaultHttpClient httpClient = new DefaultHttpClient(); 
       HttpPost httpPost = new HttpPost(url); 

       HttpResponse httpResponse = httpClient.execute(httpPost); 
       HttpEntity httpEntity = httpResponse.getEntity(); 
       is = httpEntity.getContent(); 

       BufferedReader reader = new BufferedReader(new InputStreamReader(
           is, "iso-8859-1"), 8); 
       StringBuilder sb = new StringBuilder(); 
       String line = null; 
       while ((line = reader.readLine()) != null) { 
         sb.append(line + "\n"); 
       } 
       is.close(); 
       json = sb.toString(); 
     } catch (UnsupportedEncodingException e) { 
       e.printStackTrace(); 
     } catch (ClientProtocolException e) { 
       e.printStackTrace(); 
     } catch (IOException e) { 
       e.printStackTrace(); 
     } 

     try { 
       jObj = new JSONObject(json); 
     } catch (JSONException e) { 
       Log.e("JSON Parser", "Error parsing data " + e.toString()); 
     } 

      // return JSON String 
      return jObj; 

      } 

      public void parseJson(JSONObject json) { 
      try { 

       // parsing json object 
       if (json.getString("status").equalsIgnoreCase("ok")) { 
         JSONArray posts = json.getJSONArray("posts"); 


         feedList = new ArrayList<FeedItem>(); 

         for (int i = 0; i < posts.length(); i++) { 
           JSONObject post = (JSONObject) posts.getJSONObject(i); 
           FeedItem item = new FeedItem(); 
           item.setTitle(post.getString("title")); 
           item.setDate(post.getString("description")); 
           item.setId(post.getString("id")); 
           item.setUrl(post.getString("url")); 
           item.setContent(post.getString("description")); 
           item.setInfoz(post.getString("description")); 
           JSONArray attachments = post.getJSONArray("attachments"); 

           if (null != attachments && attachments.length() > 0) { 
             JSONObject attachment = attachments.getJSONObject(0); 
             if (attachment != null) 
               item.setAttachmentUrl(attachment.getString("url")); 
           } 

           feedList.add(item); 

         } 
       } 
     } catch (JSONException e) { 
       e.printStackTrace(); 
     } 
     } 

回答

0

很簡單:你可以重寫方法onSaveInstanceState(bundle outState)和保存要到outState任何狀態。然後,在onCreateView()您可以閱讀狀態(如果有的話 - 它可能和將是無效首次啓動時)從對象savedInstanceState

+0

我已經加入此@Override \t公共無效的onSaveInstanceState(捆綁outState){ \t超.onSaveInstanceState(outState); (「feedList」,(ArrayList <?extends Parcelable>)feedList);}};}}};}} \t} and this to oncreateview feedList = savedInstanceState.getParcelableArrayList(「feedList」);但我得到錯誤綁定不匹配:類型Bundle的泛型方法getParcelableArrayList(String)不適用於參數(字符串)。推斷的類型FeedItem不是有界參數的有效替代

+0

@SandraMladenovic您需要使FeedItem實現Parcelable才能使用putParcelable()方法 - 請參閱http://developer.android.com/reference/android /os/Parcelable.html – ddmps

+0

但我已經公開課FeedItem實現Serializable,我不能實現和Parcelable,現在呢? –