近期google官网上更新了viewpager2, 支持垂直滚动, 重写之前的viewpager.
1.原理: viewpager2 内部实现原理是使用recycleview加LinearLayoutManager实现竖直滚动, 其实可以理解为对recyclerview的二次封装
源代码如下:
private void initialize(Context context, AttributeSet attrs) {
mRecyclerView = new RecyclerView(context) {
@Override
public CharSequence getAccessibilityClassName() {
return "androidx.viewpager.widget.ViewPager";
}
@Override
public void onInitializeAccessibilityEvent(@NonNull AccessibilityEvent event) {
super.onInitializeAccessibilityEvent(event);
event.setFromIndex(mCurrentItem);
event.setToIndex(mCurrentItem);
}
};
mRecyclerView.setId(ViewCompat.generateViewId());
mLayoutManager = new LinearLayoutManager(context);
mRecyclerView.setLayoutManager(mLayoutManager);
setOrientation(context, attrs);
mRecyclerView.setLayoutParams(
new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
.....
attachViewToParent(mRecyclerView, 0, mRecyclerView.getLayoutParams());
}
2. 变化:
API变动:
- FragmentStateAdapter替换了原来的 FragmentStatePagerAdapter
- RecyclerView.Adapter替换了原来的 PagerAdapter
- registerOnPageChangeCallback替换了原来的 addPageChangeListener
FragmentStateAdapter和FragmentStatePagerAdapter作用相同, 可以用viewpager来管理fragment, 区别在于viewpager2的FragmentStateAdapter与recycleview的生命周期绑定
另外viewpager2的Adapter是继承自recyclerview的adapter, 支持除了notifyDataSetChanged()
以外的notifyItemChanged(int position)
等方式, 使用上更加的便捷
3. 使用
- viewpager2放在AndroidX的库中, 引用方式:
implementation 'androidx.viewpager2:viewpager2:1.0.0-alpha01'
注意: 这里是用的androidx库, 如果你的项目中还在使用support库的话, 需要将support库迁移至androidx才可以正常使用, 否则会报各种类库找不到的问题.
AndroidX适配参考文档:
https://developer.android.com/jetpack/androidx/migrate
https://www.jianshu.com/p/41de8689615d
- xml
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/vp"
android:layout_width="match_parent"
android:layout_height="200dp"
android:orientation="vertical" />
在xml中设置orientation, 或者在代码中设置setOrientation(),可以控制横纵向
- activity中
ViewPager2 vp = findViewById(R.id.vp);
vp.setAdapter(new RecyclerView.Adapter<ViewHolder>() {
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_view, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.tv.setText("position" + position);
}
@Override
public int getItemCount() {
return 3;
}
});
网友评论