2017-02-22 40 views
0

Я пытаюсь сохранить recyclerview, даже после переключения вкладок. Я уже некоторое время собираюсь на это, и попробовал несколько методов, но никто не работает.keep Recyclerview on tab change

MainActivity.java

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

    initTab 
} 

private void initTab(){ 

    //tab setup 
    mTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost); 
    mTabHost.setup(MainActivity.this,getSupportFragmentManager(),android.R.id.tabcontent); 

    ... 

    mTabHost.addTab(mTabHost.newTabSpec("tab1").setIndicator(createTabView(icon_search, "search")), 
      searchFragment.class, null); 
    ...more tabs added... 
    return; 

Фрагмент

private RecyclerView results; 

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         final Bundle savedInstanceState){ 

    View v = inflater.inflate(R.layout.tab_search, container, false); 
    results = (RecyclerView) v.findViewById(R.id.search_results); 
    results.setHasFixedSize(true); 

    LinearLayoutManager mLayoutManager = new LinearLayoutManager(getActivity()); 
    results.setLayoutManager(mLayoutManager); 
    ScrollListener mScrollListener = new ScrollListener(mLayoutManager); 
    results.setAdapter(searchResultsAdapter); 
    results.addOnScrollListener(mScrollListener); 

    return v; 

Я не могу сделать mLayoutManager синглтона либо в противном случае я получаю сообщение об ошибке от recyclerview что-то вроде

«LayoutManager уже attatched к RecyclerView "

Портретный режим i s заблокирован, а MainActivity не переключается на другие действия.

ответ

1

Когда вы переходите от своего фрагмента, его выгружают для сохранения памяти. Затем, когда вы переходите к нему, его необходимо перезагрузить с нуля. Вот почему ваш RecyclerView теряет свои позиции. Вы можете попытаться найти способ остановить его от разгрузки, но поскольку у Android ограниченная память, мы действительно не хотим с энтузиазмом выбрасывать приятные функции управления памятью.

Вы хотите, чтобы ваш RecyclerView сохранял свои позиции. Ответ на это заключается в том, как RecyclerView получает свои предметы в первую очередь. RecyclerView просто управляет загрузкой подмножества того, что его RecyclerView.Adapter говорит, что это его элементы. Если RecyclerView.Adapter.getItemCount() возвращает 0, то RecyclerView ничего не загрузит. Таким образом, RecyclerView.Adapter является настоящим преступником.

Если вы сделаете так, чтобы ваш RecyclerView.Adapter запоминал список элементов, которые он имел последний раз, когда он был создан, вместо того, чтобы всегда начинать с пустого списка, тогда ваш RecyclerView отобразит этот список.

Теперь ваша проблема заключается в сохранении списка объектов (относительно прямолинейно), вместо того, чтобы пытаться заставить некоторые виды оставаться надутыми в фоновом режиме (относительно сложные и несколько нежелательные из-за материала памяти).

Надеюсь, это поможет.

+0

Я вижу. Я подозревал, что Адаптер был виновником, я должен был проверить его. Это было так просто, я просто сделал адаптером синглтон, и он сохранился. ранее я его создавал в onCreateView – John

+0

Я рад, что это было простое изменение для вас! Не могли бы вы отметить этот ответ, ответив на вопрос, считаете ли вы, что он ответил на ваш вопрос. – DanielLaneDC