2016-09-19 7 views
0

Ich habe eine Aktivität, Fragment mit listView und Fragment mit Details für jede listView Element. Ich erhalte Fragmentdaten von der API. Wie sollte ich das geladene Datum und die listView-Position korrekt speichern, um es wiederherstellen zu können, wenn ich zur ListView zurückkehre? Ich habe versucht, diese Lösung Once for all, how to correctly save instance state of Fragments in back stack? zu implementieren, aber ich kann meine ListView nicht korrekt wiederherstellen.So speichern Sie geladene ListView-Status im Fragment?

Mein MainActivity

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 


     //Set the fragment initially 
     listFragment = new ListFragment(); 
     fragmentTransaction = 
       getSupportFragmentManager().beginTransaction(); 
     fragmentTransaction.replace(R.id.fragment_container, listFragment); 
     fragmentTransaction.commit(); 

     if (savedInstanceState != null) { 
      //Restore the fragment's instance 
      listFragment = (ListFragment)getSupportFragmentManager().getFragment(savedInstanceState, "listContent"); 
     } 
... 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     //Save the fragment's instance 
     getSupportFragmentManager().putFragment(outState, "listContent", listFragment); 
    } 

und ListFragment

public class ListFragment extends Fragment { 

    public static final String REQUEST_TAG = "ProjectListFragment"; 

    private int page; 
    private View view; 
    private RelativeLayout loading ; 
    private PagingListView listView; 
    private PagingProjectListAdapter adapter; 
    private ArrayList<String> projects = new ArrayList<>(); 
    private ArrayList<String> loadedProjects = new ArrayList<>(); 

    public ListFragment() { 
     // Required empty public constructor 
    } 

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

     listView = (PagingListView) view.findViewById(R.id.projectsListView); 
     loading = (RelativeLayout) view.findViewById(R.id.loading); 
     //page = 1; 
     adapter = new PagingProjectListAdapter(getContext(), ListFragment.this); 
     listView.setAdapter(adapter); 
     listView.setHasMoreItems(true); 

     // Inflate the layout for this fragment 
     return view; 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     if (savedInstanceState != null) { 
      // FIXME not used 
      listView.onFinishLoading(true, projects); 
      //Restore the fragment's state here 
     } else { 
      projects.clear(); 
      page = 1; 

      listView.setPagingableListener(new PagingListView.Pagingable() { 
       @Override 
       public void onLoadMoreItems() { 
        new CustomVolleyAsyncTask().execute(); 
       } 
      }); 
     } 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putInt("currentPosition", 0); 
     //Save the fragment's state here 
    } 

    public void itemClickMethod(View detailsView) { 
     LinearLayout linearLayout = (LinearLayout) detailsView; 
     String bid = linearLayout.getContentDescription().toString(); 

     Bundle bundle = new Bundle(); 
     String k = "ProjectID"; 
     bundle.putString(k, bid); 

     DetailsFragment detailsFragment = new DetailsFragment(); 
     detailsFragment.setArguments(bundle); 

     final FragmentTransaction ft = getFragmentManager().beginTransaction(); 
     ft.replace(R.id.fragment_container, detailsFragment, "DetailsFragmentTag"); 
     ft.addToBackStack(null); 
     ft.commit(); 
    } 

    private class CustomVolleyAsyncTask extends SafeAsyncTask<List<String>> implements Response.Listener, 
      Response.ErrorListener { 

     public List<String> status = null; 
     private RequestQueue mQueue; 

     @Override 
     public List<String> call() throws Exception { 
      mQueue = CustomVolleyRequestQueue.getInstance(view.getContext()) 
        .getRequestQueue(); 
      String url = "http://www.myapi.com/api/v1/data/" + Integer.toString(page); 
      final CustomJSONObjectRequest jsonRequest = new CustomJSONObjectRequest(Request.Method 
        .GET, url, 
        new JSONObject(), this, this); 
      jsonRequest.setTag(REQUEST_TAG); 
      mQueue.add(jsonRequest); 
      // TODO rm redundant result 
      return status; 
     } 

     @Override 
     public void onErrorResponse(VolleyError error) { 
      // FIXME check no response case crash 
      //mTextView.setText(error.getMessage()); 
     } 

     @Override 
     public void onResponse(Object response) { 
      try { 
       JSONArray projectsJSON = new JSONArray(((JSONObject) response).getString("projects")); 
       loadedProjects.clear(); 
       for (int i=0; i < projectsJSON.length(); i++) { 
        loadedProjects.add(projectsJSON.getJSONObject(i).toString()); 
       } 
       page++; 

       listView.onFinishLoading(true, loadedProjects); 
       if (loading.getVisibility() == View.VISIBLE && !listView.isLoading()){ 
        listView.setVisibility(View.VISIBLE); 
        loading.setVisibility(View.GONE); 
       } 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      }}} 
} 

zur Zeit, mein savedInstanceState ist immer null, was bin ich dabei?

+0

Wird onSaveInstanceState() aufgerufen? –

Antwort

0

Ich denke, dass Ihr Fragment zweimal erstellt, wenn die Konfiguration geändert. Here Staffan erklären, warum das passiert ist. Ich löse ein ähnliches Problem auf diese Weise (in der Aktivität onCreate):

 FragmentManager fragmentManager = getSupportFragmentManager(); 
     Fragment fragment = fragmentManager.findFragmentByTag(TAG); 
     if(fragment==null) 
      fragmentManager.beginTransaction() 
        .add(R.id.container, NewsFragment.newInstance(),TAG) 
        .commit(); 
Verwandte Themen