概述
ViewPager2常用于可以滑动的视图或 Fragment。
ViewPager与ViewPager2的区别:
- ViewPager2内部是用RecyclerView实现的,性能更高。
- ViewPager2可以横向滑动,也可以竖向滑动,ViewPager只能横向滑动。
- ViewPager2默认使用了懒加载,不进行预加载。
- ViewPager2和Fragment联合使用的时候,只能使用FragmentStateAdapter,FragmentStateAdapter继承自RecyclerView.Adapter,FragmentStateAdapter进行预加载时,只会创建Fragment对象,并不会将其添加到布局中。
- ViewPager可以使用FragmentStatePagerAdapter和FragmentPagerAdapter,两者都继承自PagerAdapter,其中FragmentStatePagerAdapter不可以缓存,而FragmentPagerAdapter可以缓存。
- ViewPager2可以通过Lifecycle 对 Fragment 的生命周期进行管理。
导入
implementation "androidx.viewpager2:viewpager2:1.0.0"
布局
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<com.google.android.material.tabs.TabLayout
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@id/tab_layout" />
</androidx.constraintlayout.widget.ConstraintLayout>
setAdapter
// 标题
private String[] titles = {"Tab0", "Tab1", "Tab2", "Tab3", "Tab4", "Tab5",
"Tab6", "Tab7",};
// 颜色
private int[] colors = {R.color.black, R.color.blue, R.color.yellow,
R.color.pink, R.color.red, R.color.green, R.color.orange, R.color.purple};
// fragment
private Fragment[] fragments = new Fragment[8];
...
for (int i = 0; i < 8; i++) {
fragments[i] = ViewPagerFragment.newInstance(titles[i], colors[i]);
}
// ORIENTATION_HORIZONTAL:水平滑动(默认),ORIENTATION_VERTICAL:竖直滑动
viewPager2.setOrientation(ViewPager2.ORIENTATION_HORIZONTAL);
// 适配
viewPager2.setAdapter(new FragmentStateAdapter(getSupportFragmentManager(),getLifecycle()) {
@NonNull
@Override
public Fragment createFragment(int position) {
return fragments[position];
}
@Override
public int getItemCount() {
return fragments.length;
}
});
联动
// tab可以滑动的
tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
// tabLayout与viewPager2联动
new TabLayoutMediator(tabLayout,viewPager2, (tab, position) -> {
TextView textView = new TextView(this);
// tab标题
textView.setText(titles[position]);
// tab颜色
textView.setTextColor(getResources().getColor(colors[position]));
// tab字体大小
textView.setTextSize(24.0f);
tab.setCustomView(textView);
}).attach();
效果
SVID_20220831_163550_1
轮播图
viewPager2.setAdapter(new RecyclerView.Adapter() {
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
// 布局
return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_vp, parent, false));
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
// 内容
ViewHolder viewHolder = (ViewHolder) holder;
viewHolder.item.setText("Banner" + position);
viewHolder.item.setBackgroundColor(colors[position]);
}
@Override
public int getItemCount() {
// 长度
return titles.length;
}
class ViewHolder extends RecyclerView.ViewHolder {
TextView item;
public ViewHolder(@NonNull View itemView) {
super(itemView);
item = itemView.findViewById(R.id.tv_item);
}
}
});
效果
SVID_20220831_170531_1