ViewPager

ViewPager - один из наиболее часто используемых компонентов в Android. Он обладает уникальной функцией перелистывания страниц. Он используется с Fragment, поскольку управляет жизненным циклом каждой страницы самостоятельно.

Но это увеличивает сложность, когда реализуется с помощью фрагмента. Иногда с меньшим вниманием к фрагментам приводит к утечке памяти. Он также играет роль в реализации адаптера. Когда у нас есть несколько пейджеров View в нашем приложении, мы можем избежать адаптера FragmentPager и FragmentStatePager.

Обычно FragmentPager используется при фиксированном количестве страниц. Посещенные фрагменты хранятся в памяти до тех пор, пока они не будут уничтожены, что приводит к значительному объему памяти.

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

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

class Pager extends PagerAdapter {

    List<View> views;
    Context context;

    public Pager(List<View> views, Context context) {
        this.views = views;
        this.context = context;
    }

    public View getView(int position) {
        return views.get(position);
    }

    @Override
    public int getCount() {
        return views.size();
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView(views.get(position));
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) 
   {
       View view = views.get(position);
        container.addView(view);
        return view;
    }

    @Override
    public int getItemPosition(Object object) {
        for(int index = 0 ; index < getCount() ; index++){
        if((View)object == views.get(index)) {
            return index;
        }
        }
        return POSITION_NONE;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return "View " + (position + 1);
    }

Теперь установите для этого адаптера пейджера ViewPager,

ViewPager viewPager = findViewById(R.id.pager);
TabLayout tabLayout = findViewById(R.id.tabs_container);
List<View> views = new ArrayList<>();
//add views which we want to set as pages
pagerAdapter = new Pager(views, this);
viewPager.setAdapter(pagerAdapter);
tabLayout.setupWithViewPager(viewPager);

Таким образом, пейджер представлений реализуется со статическим списком представлений. Мы можем динамически добавлять или удалять представление из пейджера представлений.

Здесь notifyDataSetChanged () полезен только при изменении данных пейджера представления (добавляются или удаляются элементы в пейджере представления), а не для обновления содержимого фрагмента.

Чтобы добавить представление динамически:

//If we want to add page always at end , use views.size() as position
views.add(position, viewToBeAdded); 
pagerAdapter.notifyDataSetChanged();
//If we need to set last added page as current page
viewPager.setCurrentItem(position);

Чтобы удалить любую страницу динамически:

//in case of delete , make adapter null before removing view from views list
viewPager.setAdapter(null);
views.remove(view);
//Adapter needs to be reinitialised with new list of views
pagerAdapter = new Pager(cfViews, getApplicationContext());
viewPager.setAdapter(pagerAdapter);

pagerAdapter.notifyDataSetChanged();
viewPager.setCurrentItem(position);

Просмотр макета пейджера:

<RelativeLayout
    android:id="@+id/root"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.design.widget.TabLayout
            android:id="@+id/tabs_container"
            android:layout_width="wrap_content"
            app:tabSelectedTextColor="@color/color"
            app:tabTextColor="@color/black"  
            android:layout_height="48dp"
            android:background="@color/white"
            android:backgroundTint="@color/grey"
            android:paddingLeft="4dp"
            app:tabGravity="fill"
            app:tabMode="scrollable"
            app:tabPadding="16dp"
            />

    </android.support.v4.view.ViewPager>

</RelativeLayout>

Это так же просто, как добавить или удалить элемент из представления списка. Можно использовать представления вместо фрагмента в пейджере представлений, чтобы уменьшить сложность.

Беспечное кодирование!