2016-06-21 65 views
0

我有一個查看尋呼機3片段。我使用retrofit rest api來第一次填充每個片段。我想要實現的是當用戶在第一個或第三個片段(這2個片段正在被視圖尋呼機銷燬)中向後滑動以恢復數據(保存在數組列表中)並且不再休息api再次調用。我所做的就是將下載數據的數組列表保存在onSaveInstanceState()中,並且當用戶僅在第一次時滑回到上述2個片段中的一個片段時,才能成功檢索它。問題是,當我導航回到2個片段中的任何一個時,保存數組列表的特定包密鑰都包含空值。無法恢復查看尋呼機片段狀態

CompletedSurveysFragment(第三個片段):

public class CompletedSurveysFragment extends Fragment implements SAMVCView { 

    private static final String debugTag = CompletedSurveysFragment.class.getSimpleName(); 
    private View view; 
    private RecyclerView completedSurveysRcV; 
    private SAMVCPresenterImpl SAMVCpresenterImpl; 
    private SurveysRcvAdapter surveysRcvAdapter; 
    private List<SurveyData> data; 

    public CompletedSurveysFragment() {} 

    public static CompletedSurveysFragment newInstance() { 
     return new CompletedSurveysFragment(); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     Log.e(debugTag, "onCreateView"); 
     if (view == null) view = inflater.inflate(R.layout.fragment_completedsurveys, container, false); 
     completedSurveysRcV = (RecyclerView) view.findViewById(R.id.completedSurveysRcV); 
     return view; 
    } 

    // TODO: 21/6/2016 configure Limit and offset values 
    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     Log.e(debugTag, "onActivityCreated " + savedInstanceState); 
     LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity()); 
     completedSurveysRcV.setHasFixedSize(true); 
     completedSurveysRcV.setLayoutManager(linearLayoutManager); 
     completedSurveysRcV.addItemDecoration(new DividerItemDecoration(ContextCompat.getDrawable(getActivity(), R.drawable.divider))); 
     if (savedInstanceState == null) { 
      SAMVCpresenterImpl = new SAMVCPresenterImpl(this); 
      SAMVCpresenterImpl.getSurveysBasedOnSpecificFirmId(new AllSurveysBody(getResources().getString(R.string.list_surveys), LoginActivity.getSessionPrefs(getActivity()).getInt(getResources().getString(R.string.firm_id), 0), getResources().getString(R.string.completed), 8, 0)); 

      surveysRcvAdapter = new SurveysRcvAdapter(null, completedSurveysRcV); 
      completedSurveysRcV.setAdapter(surveysRcvAdapter); 
     } else { 
      //Log.e(debugTag, savedInstanceState.+""); 
      if (savedInstanceState.getParcelableArrayList("data") != null) { 
       Log.e(debugTag, "here "+ savedInstanceState); 
       surveysRcvAdapter = new SurveysRcvAdapter(savedInstanceState.<SurveyData>getParcelableArrayList("data"), completedSurveysRcV); 
       completedSurveysRcV.setAdapter(surveysRcvAdapter); 
       surveysRcvAdapter.notifyDataSetChanged(); 
      } 
      //Log.e(debugTag, getArguments().getParcelableArrayList("data")+""); 
     } 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putParcelableArrayList("data", (ArrayList<? extends Parcelable>) this.data); 
     Log.e(debugTag, "CompletedFragment onSaveInstanceState "+ outState); 
    } 

    @Override 
    public void onSuccessSurveysFetched(List<SurveyData> data) { 
     this.data = data; 
     surveysRcvAdapter = new SurveysRcvAdapter(data, completedSurveysRcV); 
     completedSurveysRcV.setAdapter(surveysRcvAdapter); 
     surveysRcvAdapter.notifyDataSetChanged(); 
    } 

    @Override 
    public void onFailure() { 

    } 
} 

查看傳呼機適配器:

public class SurveysPagerAdapter extends FragmentStatePagerAdapter { 

    private static final String debugTag = SurveysPagerAdapter.class.getSimpleName(); 
    private List<SurveyData> data; 
    String[] tabText; 

    public SurveysPagerAdapter(FragmentManager fragmentManager, String[] tabText) { 
     super(fragmentManager); 
     this.tabText = tabText; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     Log.e("SurveysPagerAdapter", position+""); 
     switch (position) { 
      case 0: 
       return CompletedSurveysFragment.newInstance(); 
      case 1: 
       return OngoingSurveysFragment.newInstance(); 
      case 2: 
       return PendingSurveysFragment.newInstance(); 
      default: 
       return null; 
     } 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return tabText[position]; 
    } 

    @Override 
    public int getCount() { 
     return 3; 
    } 
} 

回答

1

你的問題是你總是返回你的片段的新實例。而不是調用CompletedSurveysFragment.newInstance();(和你的其他片段),每次用戶揮動,創建片段的陣列和檢索這樣說:

... 
    Fragment [] pages = new Fragment[getCount()]; 
    ... 
    @Override 
     public Fragment getItem(int position) { 
      Log.e("SurveysPagerAdapter", position+""); 
    switch (position) { 
       case 0: 
        if(pages[position] == null) 
         pages[position] = CompletedSurveysFragment.newInstance(); 
        return pages[position]; 
    ... 
    } 

然後,您可以獲取和onCreate()緩存數據,後來在onResume()檢索在你的各自的片段。

+0

我得到java.lang.IndexOutOfBoundsException:無效的索引0,大小爲0 – tsiro

+0

switch(position){ case 0: if(pages.get(position)== null)pages.set(position,CompletedSurveysFragment.newInstance )); return pages.get(position);如果(pages.get(position)== null)pages.set(position,OngoingSurveysFragment.newInstance()); return pages.get(position); 情況2: if(pages.get(position)== null)頁面。set(position,PendingSurveysFragment.newInstance()); return pages.get(position); 默認值: 返回null; – tsiro

+0

更新了答案 – C0D3LIC1OU5

0

出現這種情況的原因是因爲當父活動的onSaveInstanceState關閉只發生。由於viewpager的父活動在切換片段時仍處於活動狀態,因此不會調用onSaveInstanceState。

要獲得要保存的數據,就像您打算的一樣,我可能會做的是將數據保存在onPause()中,並檢索onResume()中的數據。

編輯

根據你需要把調用super.onSaveInstanceState(savedInstanceState);修改Bundledocs

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    // Save the user's current game state 
    savedInstanceState.putInt(STATE_SCORE, mCurrentScore); 
    savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel); 

    // Always call the superclass so it can save the view hierarchy state 
    super.onSaveInstanceState(savedInstanceState); 
} 
+0

onSaveInstanceState在片段銷燬時總是被調用...使用日誌進行檢查.. – tsiro

+0

我編輯了我的答案。它看起來像是在調用onSaveInstanceState時,super需要最後一次,以便將修改後的savedInstanceState對象傳遞給它。 – user3331142

0

我覺得onPause()onResume()將無法​​正常工作。碎片與其父級活動相關聯,因此,您瀏覽碎片後,父級活動的狀態爲onResume()。我建議你要做的是使用單身對象來獲取和存儲你的數據。每個片段都可以保留對相應對象的引用,並可以即時訪問所需的數據。有很多關於單身模式的信息以及它是如何工作的。

相關問題