2

Я сделал приложение с фрагментом, содержащим ViewPager. Внутри этого ViewPager я показываю список, используя RecyclerView. Когда я запускаю приложение, все отлично. Но когда я прокручиваю несколько вкладок, а возвращающийся список не отображается. Я не знаю, что это неправильно ...Исчезающие данные из RecyclerView

Фрагмент отображается внутри ViewPager

public class GradesFragmentPage extends Fragment { 
    View view; 
    List<Grade> gradeList; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.grades_page_fragment, container, false); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

     BetterRecyclerView betterRecyclerView = (BetterRecyclerView) getActivity().findViewById(R.id.gradesRecycler); 
     betterRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); 
    } 

    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     this.view = view; 

     if(getArguments() != null) { 
      gradeList = getArguments().getParcelableArrayList("grades"); 

      BetterRecyclerView betterRecyclerView = (BetterRecyclerView) view.findViewById(R.id.gradesRecycler); 
      betterRecyclerView.setAdapter(new GradesAdapter(getActivity(), gradeList)); 
     } 
    } 
} 

BetterRecyclerView

public class BetterRecyclerView extends RecyclerView { 
    public BetterRecyclerView(Context context) { 
     super(context); 
    } 

    public BetterRecyclerView(Context context, AttributeSet attrs) { 
     super(context,attrs); 

     setLayoutManager(new LayoutManager() { 
      @Override 
      public LayoutParams generateDefaultLayoutParams() { 
       return null; 
      } 
     }); 
    } 

    public BetterRecyclerView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    //we need this protected method for scroll detection 
    public int getVerticalScrollOffset() { 
     return computeVerticalScrollOffset(); 
    } 
} 

ответ

3

сам ViewPager имеет метод setOffscreenPageLimit, который позволяет указать номер страниц, поддерживаемых адаптером. Таким образом, ваши фрагменты, которые находятся далеко, будут уничтожены.

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

viewPager.setOffscreenPageLimit(10); 
Смежные вопросы