1

У меня есть recyclerview, имеющие разные макеты для портрета и пейзажа. Когда действие начинается, recyclerview заполняется данными независимо от ориентации. Но если ориентация изменяется, данные не отображаются. И никакие данные не показываются при последующих изменениях ориентации.Recyclerview не заполняется данными после изменения ориентации

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    Log.d("CCC", "OnCreate View called"); 
    View view = inflater.inflate(R.layout.fragment_coach_list, container, false); 
    new NetworkConnector(getActivity(), coachListURL, method, null, new OnRequestComplete()); 
    Log.d("CCC", "Network connector called"); 
    return view; 
} 

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    Log.d("CCC", "On View created called"); 
    //if rv is declared in oncreateview then NPE during setadapter 
    coachRecyclerView = (RecyclerView) getActivity().findViewById(R.id.fcoachlist_rv); 
    final LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity()); 
    layoutManager.setOrientation(LinearLayoutManager.VERTICAL); 
    Log.d("CCC", "orientation " + layoutManager.getOrientation()); 
    coachRecyclerView.setLayoutManager(layoutManager); 
} 

private class OnRequestComplete implements RequestCompleteListener<String> { 

    public OnRequestComplete() { 
    } 

    @Override 
    public void onRequestExecuted(String responseType, String result) { 
     if (!responseType.equals("error")) { 
      try { 
       JSONObject jsonResponse = new JSONObject(result); 
       Log.d("CCC", "Result: " + result); 
       String coachResult = jsonResponse.getString("success"); 
       switch (coachResult) { 
        case "1": 
         ArrayList<CoachList> coachListData = parseJSONResponse(jsonResponse); 
         coachListAdapter = new CoachListAdapter(getActivity()); 
         coachListAdapter.setCoachList(coachListData); 
         coachRecyclerView.setAdapter(coachListAdapter); 
         if(coachRecyclerView.getAdapter()== null){ 
          Log.d("CCC", "Adapter is null"); 
         } else if (coachRecyclerView.getAdapter()== coachListAdapter){ 
          Log.d("CCC", "Adapter is coachlistAdapter"); 
         } else { 
          Log.d("CCC", "This is odd!!"); 
         } 
         Log.d("CCC", "Size " + coachListAdapter.getItemCount()); 
         break; 
        case "0": 
         Toast.makeText(getActivity(), "No trainers available currently", Toast.LENGTH_LONG).show(); 
         break; 
        case "-1": 
         Toast.makeText(getActivity(), "Please try again later", Toast.LENGTH_LONG).show(); 
         break; 
       } 
      } catch (JSONException e) { 
       Log.d("CCC", "CoachList JSONException"); 
      } 
     } 
    } 
} 

NetworkConnector - это класс, выполняющий строчку volley stringrequest.

Вот logcat, когда активность запущена, и ориентация не изменяется.

03-18 07:06:57.702 30392-30392/in.jiyofit.the_app D/CCC: OnCreate View called 
03-18 07:06:57.722 30392-30392/in.jiyofit.the_app D/CCC: Network connector called 
03-18 07:06:57.722 30392-30392/in.jiyofit.the_app D/CCC: On View created called 
03-18 07:06:57.722 30392-30392/in.jiyofit.the_app D/CCC: orientation 1 
03-18 07:06:57.774 30392-30392/in.jiyofit.the_app W/EGL_genymotion: eglSurfaceAttrib not implemented 
03-18 07:06:57.774 30392-30392/in.jiyofit.the_app E/RecyclerView: No adapter attached; skipping layout 
03-18 07:06:57.778 30392-30392/in.jiyofit.the_app D/CCC: Result: {"success":"1","Coaches":[{"CoachID":"1","Coach_Name":"Tyler //lots of json 
03-18 07:06:57.778 30392-30392/in.jiyofit.the_app D/CCC: Adapter is coachlistAdapter 
03-18 07:06:57.778 30392-30392/in.jiyofit.the_app D/CCC: Size 4 
03-18 07:06:57.946 30392-30488/in.jiyofit.the_app D/dalvikvm: GC_FOR_ALLOC freed 414K, 6% free 8585K/9076K, paused 8ms, total 8ms 
03-18 07:06:59.426 30392-30392/in.jiyofit.the_app D/CCC: Result: {"success":"1","Coaches":[{"CoachID":"1","Coach_Name":"Tyler ...//lots of json 
03-18 07:06:59.426 30392-30392/in.jiyofit.the_app D/CCC: Adapter is coachlistAdapter 
03-18 07:06:59.426 30392-30392/in.jiyofit.the_app D/CCC: Size 4 

Приведенный нижеописанный признак регистрации при изменении ориентации.

03-18 07:13:53.792 30392-30392/in.jiyofit.the_app D/CCC: OnCreate View called 
03-18 07:13:53.796 30392-30392/in.jiyofit.the_app D/CCC: Network connector called 
03-18 07:13:53.796 30392-30392/in.jiyofit.the_app D/CCC: On View created called 
03-18 07:13:53.796 30392-30392/in.jiyofit.the_app D/CCC: orientation 1 
03-18 07:13:53.796 30392-30392/in.jiyofit.the_app D/CCC: OnCreate View called 
03-18 07:13:53.796 30392-30392/in.jiyofit.the_app D/CCC: Network connector called 
03-18 07:13:53.796 30392-30392/in.jiyofit.the_app D/CCC: On View created called 
03-18 07:13:53.796 30392-30392/in.jiyofit.the_app D/CCC: orientation 1 
03-18 07:13:53.856 30392-30392/in.jiyofit.the_app W/EGL_genymotion: eglSurfaceAttrib not implemented 
03-18 07:13:53.856 30392-30392/in.jiyofit.the_app E/RecyclerView: No adapter attached; skipping layout 
03-18 07:13:53.856 30392-30392/in.jiyofit.the_app E/RecyclerView: No adapter attached; skipping layout 
03-18 07:13:53.872 30392-30392/in.jiyofit.the_app D/dalvikvm: GC_FOR_ALLOC freed 554K, 7% free 9823K/10452K, paused 4ms, total 4ms 
03-18 07:13:53.888 30392-30392/in.jiyofit.the_app D/CCC: Result: {"success":"1","Coaches":[{"CoachID":"1","Coach_Name":"Tyler //lots of json 
03-18 07:13:53.888 30392-30392/in.jiyofit.the_app D/CCC: Adapter is coachlistAdapter 
03-18 07:13:53.888 30392-30392/in.jiyofit.the_app D/CCC: Size 4 
03-18 07:13:53.996 30392-30392/in.jiyofit.the_app E/RecyclerView: No adapter attached; skipping layout 
03-18 07:13:54.676 30392-30392/in.jiyofit.the_app D/CCC: Result: {"success":"1","Coaches":[{"CoachID":"1","Coach_Name":"Tyler //lots of json 
03-18 07:13:54.680 30392-30392/in.jiyofit.the_app D/CCC: Adapter is coachlistAdapter 
03-18 07:13:54.680 30392-30392/in.jiyofit.the_app D/CCC: Size 4 
03-18 07:13:54.736 30392-30392/in.jiyofit.the_app D/CCC: Result: {"success":"1","Coaches":[{"CoachID":"1","Coach_Name":"Tyler //lots of json 
03-18 07:13:54.736 30392-30392/in.jiyofit.the_app D/CCC: Adapter is coachlistAdapter 
03-18 07:13:54.736 30392-30392/in.jiyofit.the_app D/CCC: Size 4 

Как видно, некоторые части кода вызывается повторно. Я не знаю почему. OnCreateView вызывается снова после вызова onViewCreated после изменения ориентации. Вероятно, это вызывает проблему. Любая помощь будет оценена по достоинству. Благодарю.

+0

Вы уверены, что ваш код не добавляет несколько экземпляров этого фрагмента? – Luksprog

+0

только один экземпляр фрагмента называется – suku

+0

Если вы просто хотите разрешить вращение экрана, но ничего конкретного в зависимости от макета, то я считаю, что вы должны переопределить метод onConfigurationChanged в действиях. Также добавьте его в файл манифеста. Для получения дополнительной информации см. Здесь: http://stackoverflow.com/a/2418763/1750013 –

ответ

3

Это было решено путем сохранения экземпляра фрагмента в активности. Сохранение состояния компоновщика макета в фрагменте и восстановление его при вращении не решило этого.

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    //this activity extends baseactivity 
    //inflating activity layout in a framelayout inside baseactivity 
    getLayoutInflater().inflate(R.layout.activity_hire_coach, contentFrameLayout); 
    if (savedInstanceState != null) { 
     //Restore the fragment's instance 
     coachListFragment = (CoachListFragment) getFragmentManager().getFragment(savedInstanceState, "coachListFrag"); 
    } else { 
     coachListFragment = new CoachListFragment(); 
     getFragmentManager().beginTransaction().add(R.id.ahirecoach_layout, coachListFragment, "coachListFragment").commit(); 
    } 
} 

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

Ссылка: https://stackoverflow.com/a/17135346/5512020

0
protected void onSaveInstanceState(Bundle state) { 
super.onSaveInstanceState(state); 
// Save list state 
mListState = mLayoutManager.onSaveInstanceState(); 
state.putParcelable(LIST_STATE_KEY, mListState); 
} 
Restore state in the onRestoreInstanceState(): 

protected void onRestoreInstanceState(Bundle state) { 
super.onRestoreInstanceState(state); 

// Retrieve list state and list/item positions 
if(state != null) 
mListState = state.getParcelable("myState"); 
} 
Then update the LayoutManager (I do in onResume()): 

@Override 
protected void onResume() { 
super.onResume(); 

if (mListState != null) { 
mLayoutManager.onRestoreInstanceState(mListState); 
} 
} 
+0

Я пробовал это. Это не сработало. Проблема заключается не в потере данных. Даже если данные снова получены, он не отображается. Рециркуляция остается пустой. Адаптер также установлен. – suku

1

Во фрагменте, простой способ сохранить данные при вращении, чтобы создать адаптер OnCreate() есть также установить фрагмент, чтобы сохранить свое состояние setRetainInstance(true). onResume() примените адаптер к вашему recyclerview, также вызовите adapter.notifyDataSetChanged(), чтобы заполнить ваш recyclerView. Вот как это сработало для меня.