ViewPager2总结
概述
ViewPager2是一个增强版的ViewPager,ViewPager2是基于RecyclerView+PagerSnapHelper实现的,解决了ViewPager的一些弊端,同时加入一些新特性。
常用API
//设置分页方向
setOrientation(@Orientation int orientation)
//定位指定页面
setCurrentItem(int item)
setCurrentItem(int item, boolean smoothScroll)
//设置预加载页数
setOffscreenPageLimit(@OffscreenPageLimit int limit)
//禁止滑动
setUserInputEnabled(boolean enabled)
//模拟滑动
beginFakeDrag()
fakeDragBy(float offsetPxFloat)
//停止模拟
endFakeDrag()
//全部刷新
notifyDataSetChanged();
//局部刷新
notifyItemChanged(int position)
//监听页面变化
registerOnPageChangeCallback(@NonNull OnPageChangeCallback callback)
//删除监听
unregisterOnPageChangeCallback(@NonNull OnPageChangeCallback callback)
ViewPager2实现引导页
GuideAdapter
public class GuideAdapter extends RecyclerView.Adapter<GuideAdapter.MyViewHolder> {
private final LayoutInflater inflater;
private final int[] mImgIds;
public GuideAdapter(Context context, int[] imgIds) {
inflater = LayoutInflater.from(context);
mImgIds = imgIds;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new MyViewHolder(inflater.inflate(R.layout.item_guide, parent, false));
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
holder.imageView.setImageResource(mImgIds[position]);
}
@Override
public int getItemCount() {
return mImgIds.length;
}
static class MyViewHolder extends RecyclerView.ViewHolder {
private final ImageView imageView;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
imageView = (ImageView) itemView;
}
}
}
GuideActivity
public class GuideActivity extends AppCompatActivity {
private int[] imgIds = {
R.drawable.a1, R.drawable.a2, R.drawable.a3, R.drawable.a4};
private LinearLayout indicator;
private LinearLayout indicator2;
private ViewPager2 viewPager2;
private ArrayList<View> dotList;
private Context context;
private int distance;
private View point;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_guide);
context = this;
initViews();
initData();
indicator2.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
indicator2.getViewTreeObserver().removeOnGlobalLayoutListener(this);
distance = indicator2.getChildAt(1).getLeft() - indicator2.getChildAt(0).getLeft();
}
});
viewPager2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
super.onPageScrolled(position, positionOffset, positionOffsetPixels);
int leftMargin = (int) (distance * (position + positionOffset));
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) point.getLayoutParams();
params.leftMargin = leftMargin;
point.setLayoutParams(params);
}
@Override
public void onPageSelected(int position) {
super.onPageSelected(position);
for (int i = 0; i < dotList.size(); i++) {
if (i == position) {
dotList.get(i).setSelected(true);
} else {
dotList.get(i).setSelected(false);
}
}
}
@Override
public void onPageScrollStateChanged(int state) {
super.onPageScrollStateChanged(state);
}
});
}
private void initViews() {
indicator = findViewById(R.id.indicator);
indicator2 = findViewById(R.id.indicator2);
viewPager2 = findViewById(R.id.viewPager2);
point = findViewById(R.id.point);
GuideAdapter mAdapter = new GuideAdapter(this, imgIds);
viewPager2.setAdapter(mAdapter);
}
private void initData() {
int width = UiUtils.dp2px(context, 10);
for (int i = 0; i < imgIds.length; i++) {
View dot = new View(context);
dot.setBackgroundResource(R.drawable.shape_dot_normal);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(width, width);
if (i != 0) {
params.leftMargin = width;
}
dot.setLayoutParams(params);
indicator.addView(dot);
}
dotList = new ArrayList<>(imgIds.length);
for (int i = 0; i < imgIds.length; i++) {
View dot = new View(context);
dot.setBackgroundResource(R.drawable.selector_dot);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(width, width);
if (i != 0) {
params.leftMargin = width;
} else {
dot.setSelected(true);
}
dot.setLayoutParams(params);
indicator2.addView(dot);
dotList.add(dot);
}
}
}
ViewPager2+Fragment+TabLayout
XML布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical"
tools:context=".tabs.TabActivity">
<com.google.android.material.tabs.TabLayout
android:id="@+id/tabLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabIndicatorColor="#ff0000"
app:tabIndicatorFullWidth="true"
app:tabMode="fixed"
app:tabSelectedTextColor="#ff0000"
app:tabTextColor="@color/black" />
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewPager2"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
SimpleFragment
public class SimpleFragment extends Fragment {
private String desc;
public static SimpleFragment newInstance(String desc) {
SimpleFragment fragment = new SimpleFragment();
Bundle args = new Bundle();
args.putString("desc", desc);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
desc = getArguments().getString("desc");
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_simple, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
TextView content = view.findViewById(R.id.content);
content.setText(desc);
}
}
TabActivity
public class TabActivity extends AppCompatActivity {
private ViewPager2 viewPager2;
private TabLayout tabLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tab);
viewPager2 = findViewById(R.id.viewPager2);
tabLayout = findViewById(R.id.tabLayout);
ArrayList<SimpleFragment> fragmentList = new ArrayList<>();
fragmentList.add(SimpleFragment.newInstance("AAA"));
fragmentList.add(SimpleFragment.newInstance("BBB"));
fragmentList.add(SimpleFragment.newInstance("CCC"));
fragmentList.add(SimpleFragment.newInstance("DDD"));
ArrayList<String> titleList = new ArrayList<>();
titleList.add("One");
titleList.add("Two");
titleList.add("Three");
titleList.add("Four");
TabAdapter mAdapter = new TabAdapter(this, fragmentList);
viewPager2.setAdapter(mAdapter);
new TabLayoutMediator(tabLayout, viewPager2, new TabLayoutMediator.TabConfigurationStrategy() {
@Override
public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {
tab.setText(titleList.get(position));
}
}).attach();
}
}
TabAdapter
public class TabAdapter extends FragmentStateAdapter {
private final ArrayList<SimpleFragment> mFragmentList;
public TabAdapter(@NonNull FragmentActivity fragmentActivity, ArrayList<SimpleFragment> fragmentList) {
super(fragmentActivity);
mFragmentList = fragmentList;
}
@NonNull
@Override
public Fragment createFragment(int position) {
return mFragmentList.get(position);
}
@Override
public int getItemCount() {
return mFragmentList.size();
}
}