[Android] ViewPager2 사용해보기

New ViewPager Version

Posted by JungHoon-Park on May 26, 2019

ViewPager2

구글에서 May 7, 2019 에 새로운 viewpager2 알파버전을 공개했다.
기존의 ViewPager 와 변경된 점은 RTL 레이아웃 지원, 세로 모드 지원, 기존 ViewPager의 notifyDataSetChanged 버그 문제해결, offscreenPageLimit를 통한 뷰 계층에 저장된 뷰나 프레그먼트를 제어할 수 있다는 점입니다.

ViewPager2 사용해보기

우선 ViewPager2는 AndroidX 용으로 나왔기때문에 프로젝트가 AndroidX 로 마이그레이션 되어야한다.

1.build.gradle에 추가하기

1
2
//viewpager2
implementation 'androidx.viewpager2:viewpager2:1.0.0-alpha04'

2.xml에 ViewPager2 추가

필자는 viewpager2 가 있는 xml에서 Databinding을 사용하였다.
[참고] viewpager2의 layout_width, layout_heightmatch_parent로 해주어야 에러가 나지않는다. 크기를 지정해서 사용하고싶다면 viewpager2를 다른 뷰그룹으로 감싸주고 상위뷰의 크기를 변경시켜주어야한다.

1
2
3
4
5
6
<androidx.viewpager2.widget.ViewPager2
    android:id="@+id/view_pager"
    android:background="#BABABD"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"/>

3.ViewPager2 에 들어갈 아이템 xml 정의하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<layout xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <data>
        <variable
            name="imageUrl"
            type="String" />
    </data>
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <ImageView
            android:id="@+id/imageView3"
            app:photoUrl="@{imageUrl}"
            android:layout_width="0dp"
            android:layout_height="150dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.5"
            app:layout_constraintWidth_percent="0.7"
            tools:ignore="ContentDescription" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

4.ViewPager2 Adapter 구현하기

viewpager2의 adapter는 이전과 다르게 RecyclerView의 adapter를 구현하는것과 똑같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
private static class PhotoAdapter extends RecyclerView.Adapter<PhotoAdapter.PhotoViewHolder> {
    private List<String> mItems;

    public PhotoAdapter(List<String> mItems) {
        this.mItems = mItems;
    }

    @NonNull
    @Override
    public PhotoAdapter.PhotoViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_photo, parent, false);
        return new PhotoViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull PhotoAdapter.PhotoViewHolder holder, int position) {
        holder.binding.setImageUrl(mItems.get(position));
    }

    @Override
    public int getItemCount() {
        return mItems.size();
    }

    public class PhotoViewHolder extends RecyclerView.ViewHolder {
        ItemPhotoBinding binding;

        public PhotoViewHolder(@NonNull View itemView) {
            super(itemView);
            binding = DataBindingUtil.bind(itemView);
        }
    }
}

5.ViewPager2에 adapter 설정해주기

1
2
3
4
5
6
7
8
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    FragmentItemDetailBinding binding = DataBindingUtil.bind(view);

    PhotoAdapter adapter = new PhotoAdapter(mProduct.getPhotoUrl());
    binding.viewPager.setAdapter(adapter);
}

ViewPager2 Goole Sample 링크
안드로이드 공식 문서 링크