Android中ViewPager2的介绍,以及它的使用示例

ViewPager2Android 官方提供的一个用于实现页面滚动视图的库。它是 ViewPager 的增强版,基于 RecyclerView 实现,提供了更多的功能和更好的。ViewPager2 能够更有效地处理页面切换,并且支持垂直方向的滑动。可以实现页面滚动视图,常用于展示图片画廊、应用主界面标签页等场景。由于基于 RecyclerView,可以充分利用 RecyclerView 的各种配置功能,如 ItemDecorationLayoutManager 等。

ViewPager2 的优点

  1. 性能优化ViewPager2 因为基于 RecyclerView,所以在性能上有所优化,尤其是在处理大量数据或者复杂的页面切换动画时。

  2. 更好的可扩展性ViewPager2 使用 RecyclerView 的设计,使得扩展性更强,可以充分利用 RecyclerView 的各种配置功能,如 ItemDecorationLayoutManager 等。

  3. 支持差分更新(DiffUtil)ViewPager2 支持差分更新,可以高效地更新数据,当数据发生变化时,只需要更新变化的部分,而不是重新加载整个列表。

  4. 支持页面转换效果(PageTransformer)ViewPager2 提供了 PageTransformer 接口,允许开发者自定义页面转换效果,比如缩放、滑动时的淡入淡出等。

  5. 更流畅的滑动体验ViewPager2 的滑动体验更加流畅,它提供了更多的控制滑动手势的方法,如 setUserInputEnabledsetIsNestedScrollingEnabled

  6. 与 TabLayout 更好的集成ViewPager2 使用 TabLayoutMediatorTabLayout 集成,提供了更多的灵活性,并且可以更容易地标签页的动态添加和移除。

  7. 生命周期管理ViewPager2 默认支持懒加载,并且通过 LifecycleFragment 的生命周期进行管理,这有助于提高应用的性能。

  8. 易于使用和集成ViewPager2 的 API 设计简单直观,易于理解和使用,可以轻松集成到现有的项目中。

总的来说,ViewPager2 在性能、可扩展性、用户体验和集成方面都有显著的改进,是 Android 开发者在实现页面滚动视图时的一个很好的选择。

ViewPager2 与 ViewPager 的区别

  1. 内部实现ViewPager2 使用 RecyclerView,而 ViewPager 使用自己的滑动机制。
  2. 性能ViewPager2 因为基于 RecyclerView,性能更优。
  3. 方向ViewPager2 支持竖直方向的滑动,而 ViewPager 仅支持水平方向。
  4. AdapterViewPager2 使用单一的Adapter,且继承自 RecyclerView.Adapter,而 ViewPager使用两种 AdapterFragmentStatePagerAdapterFragmentPagerAdapter)。
  5. 生命周期管理ViewPager2 默认支持懒加载,并且通过 LifecycleFragment 的生命周期进行管理。而 ViewPager 需要手动实现懒加载,并且预加载机制默认开启。
  6. TabLayout 集成ViewPagerTabLayout 的集成通过 setupWithViewPager() 方法,而 ViewPager2 使用 TabLayoutMediator

使用示例:
添加依赖

dependencies {
    implementation "androidx.viewpager2:viewpager2:1.0.0"
}

布局

<androidx.viewpager2.widget.ViewPager2
    android:id="@+id/viewPager
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

import android.os.Bundle
import android.view.LayoutInflater
import android.view.ViewGroup
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.viewpager2.widget.ViewPager2
import androidx.lifecycle.Lifecycle
import androidx.viewpager2.adapter.FragmentStateAdapter

class MainActivity : AppCompatActivity() {

    private lateinit var viewPager2: ViewPager2

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        viewPager2 = findViewById(R.id.viewPager)

        // 创建一个 FragmentStateAdapter
        val adapter = MyFragmentStateAdapter(lifecycle)

        // 设置 ViewPager2 的 adapter
        viewPager2.adapter = adapter
    }
}

// 自定义 FragmentStateAdapter
class MyFragmentStateAdapter(private val lifecycle: Lifecycle) : FragmentStateAdapter(lifecycle) {
    private val pageTitles = listOf("Page 1", "Page 2", "Page 3")

    override fun getItemCount() = pageTitles.size

    override fun createFragment(position: Int): Fragment {
        return TextFragment().apply {
            arguments = Bundle().apply {
                putString("title", pageTitles[position])
            }
        }
    }
}

// 自定义 Fragment
class TextFragment : Fragment() {
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val view = inflater.inflate(R.layout.fragment_text, container, false)
        val title = arguments?.getString("title")
        title?.let {
            view.findViewById<TextView>(R.id.textView).text = it
        }
        return view
    }
}

在这个示例中,创建了一个 MyFragmentStateAdapter 类,它继承自 FragmentStateAdapter。这个 adapter 管理一个简单的 Fragment 列表,每个 Fragment 显示一个文本。使用 Lifecycle 来确保 adapter 与 Activity 的生命周期同步。

TextFragment 是另一个自定义的 Fragment,它展示了一个文本视图。在 onCreateView 方法中,从 arguments 中获取标题并设置到文本视图上。

最后在 ActivityonCreate 方法中设置了 ViewPager2 的 adapter,并将 ViewPager2 与布局中的 ID 关联。

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android ViewPager2 可以通过设置 `RecyclerView.OnScrollListener` 监听 ViewPager2 的滚动事件,然后在滚动到边界时触发边界回弹效果。 下面是一个示例: ```java public class BounceViewPager2 implements RecyclerView.OnScrollListener { private ViewPager2 viewPager2; private int lastPosition; public BounceViewPager2(ViewPager2 viewPager2) { this.viewPager2 = viewPager2; viewPager2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() { @Override public void onPageSelected(int position) { lastPosition = position; } }); viewPager2.addOnScrollListener(this); } @Override public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { if (newState == RecyclerView.SCROLL_STATE_IDLE) { int itemCount = viewPager2.getAdapter().getItemCount(); int currentPosition = viewPager2.getCurrentItem(); if (lastPosition == currentPosition && (currentPosition == 0 || currentPosition == itemCount - 1)) { new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { viewPager2.setCurrentItem(currentPosition == 0 ? itemCount - 1 : 0, false); } }); } } } } ``` 在这个示例,我们创建了一个名为 `BounceViewPager2` 的类来处理边界回弹的逻辑。在构造函数,我们注册了一个 `ViewPager2.OnPageChangeCallback`,用于监听当前 ViewPager2 的当前页码。同时,我们通过 `addOnScrollListener` 方法注册了一个 `RecyclerView.OnScrollListener`,用于监听滚动事件。 在 `onScrollStateChanged` 方法,我们判断当前的滚动状态是否为 `SCROLL_STATE_IDLE`,即用户停止滚动时。如果当前页码等于上次页码,并且当前页码是第一页或最后一页,则我们通过 `Handler` 将 ViewPager2 的当前页码切换到第一页或最后一页,并且禁用滚动动画(即最后一个参数设置为 `false`)。 最后,我们可以在我们的 `Activity` 或 `Fragment` 使用 `BounceViewPager2` 类来实现边界回弹效果: ```java BounceViewPager2 bounceViewPager2 = new BounceViewPager2(viewPager2); ``` 这样,当用户在滚动 ViewPager2 达到边界时,就会触发边界回弹效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值