Android如何丰富arraylist

问题描述:

我正在制作一个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(); 
     } 
     } 

很简单:你可以重写方法onSaveInstanceState(bundle outState)和保存要到outState任何状态。然后,在onCreateView()您可以阅读状态(如果有的话 - 它可能和将是无效首次启动时)从对象savedInstanceState

+0

我已经加入此@Override \t公共无效的onSaveInstanceState(捆绑outState){ \t超.onSaveInstanceState(outState); (“feedList”,(ArrayList )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,现在呢? –