參考:http://m.itdecent.cn/p/e754cbd2d329
1.簡介。
今天我們介紹一下豬腳-ViewPager2,ViewPager2的出現(xiàn)是為了替代ViewPager,它有以下幾個優(yōu)勢:
- 支持RTL布局,
- 支持豎向滾動
- 支持notifyDataSetChanged
RTL布局是Right To Left 布局也就是從右往左的布局,大家知道我們平常寫的布局都是從左往右,但是如果你適配阿拉伯語等環(huán)境的UI布局,他們的寫法是從右往左的,具體這里不做研究。
API的變動:
- FragmentStateAdapter替換了原來的 FragmentStatePagerAdapter
- RecyclerView.Adapter替換了原來的 PagerAdapter
- registerOnPageChangeCallback替換了原來的 addPageChangeListener
ViewPager2是直接繼承ViewGroup的,意味著和ViewPager不兼容.ViewPager2的核心實現(xiàn)就是RecyclerView+LinearLayoutManager了,因為LinearLayoutManager本身就支持豎向和橫向兩種布局方式,所以ViewPager2也能很容易地支持這兩種滾動方向了,而幾乎不需要添加任何多余的代碼。
2.使用。
具體使用我查看了Google的github倉庫,地址 :ViewPager2
注意Github的ViewPager2是Kotlin版本,我在這里給大家翻譯成Java版本進行解讀。
2.1基本使用
布局:

image.png
Adapter:注意RecyclerView.Adapter替換了原來的 PagerAdapter
public class BaseAdapter extends RecyclerView.Adapter<BaseAdapter.BaseViewHolder>{
LinkedList<String> datas;
public BaseAdapter(LinkedList<String> datas) {
this.datas = datas;
}
@NonNull
@Override
public BaseViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_baseitem,parent,false);
return new BaseViewHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull BaseViewHolder holder, int position) {
holder.tvPage.setText(datas.get(position));
}
@Override
public int getItemCount() {
return datas.size();
}
public class BaseViewHolder extends RecyclerView.ViewHolder{
TextView tvPage;
public BaseViewHolder(@NonNull View itemView) {
super(itemView);
tvPage =itemView.findViewById(R.id.tv_baseitem_page);
}
}
}
Activity中的代碼:
public class BaseViewPagerActivity extends AppCompatActivity {
ViewPager2 vpBase;
LinkedList<String> datas ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_base_view_pager);
vpBase=findViewById(R.id.base_vp);
datas =new LinkedList<>();
datas.add("第一頁");
datas.add("第二頁");
datas.add("第三頁");
initViewPager();
}
/**
* 初始化ViewPager
*/
private void initViewPager() {
BaseAdapter baseAdapter =new BaseAdapter(datas);
vpBase.setAdapter(baseAdapter);
//禁止?jié)L動true為可以滑動false為禁止
vpBase.setUserInputEnabled(true);
//設置垂直滾動ORIENTATION_VERTICAL,橫向的為
vpBase.setOrientation(ViewPager2.ORIENTATION_HORIZONTAL);
//切換到指定頁,是否展示過渡中間頁
vpBase.setCurrentItem(1,true);
//設置一個縮放動畫
vpBase.setPageTransformer(mAnimator);
//滑動監(jiān)聽
vpBase.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
super.onPageScrolled(position, positionOffset, positionOffsetPixels);
Log.e(TAG, "onPageScrolled: "+position+"--->"+positionOffset+"--->"+positionOffsetPixels );
}
@Override
public void onPageSelected(int position) {
super.onPageSelected(position);
Log.e(TAG, "onPageSelected: "+position );
}
@Override
public void onPageScrollStateChanged(int state) {
super.onPageScrollStateChanged(state);
Log.e(TAG, "onPageScrollStateChanged: "+state );
}
});
}
ViewPager2.PageTransformer mAnimator =new ViewPager2.PageTransformer() {
@Override
public void transformPage(@NonNull View page, float position) {
Float absPos = Math.abs(position);
Float scaleX ;
Float scaleY;
if (absPos > 1){
scaleX= 0F;
scaleY= 0F;
}else{
scaleX= 1 - absPos ;
scaleY= 1 - absPos ;
}
page.setScaleX(scaleX);
page.setScaleY(scaleY);
}
};
}
如過是想實現(xiàn)Fragment,只需要把RecyclerView.Adapter改為FragmentStateAdapter即可,具體不多說。
基本使用就這些,不難。
2.1結合Tablayout使用
算了,不想說了。去Github看官方demo吧。地址 :ViewPager2
告辭。