Android ViewPager2总结

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基本使用

在这里插入图片描述

class ViewPager2SimpleActivity : BaseActivity() {
    private lateinit var viewPager2: ViewPager2
    private lateinit var indicator: LinearLayout

    //图片资源
    private val mImgIds =
        intArrayOf(R.drawable.a, R.drawable.b, R.drawable.c, R.drawable.d, R.drawable.e)

    companion object {
        fun start(context: Context) {
            val intent = Intent(context, ViewPager2SimpleActivity::class.java).apply {
                putExtra(KEY_TITLE, "ViewPager2基本使用")
            }
            context.startActivity(intent)
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_view_pager2_simple)
        initView()
        initViewPager2()
    }

    private fun initView() {
        viewPager2 = findViewById(R.id.viewPager2)
        indicator = findViewById(R.id.indicator)
    }

    private fun initViewPager2() {
        val width = dp2px(10)

        for (i in mImgIds.indices) {
            val dot = View(this)
            dot.setBackgroundResource(R.drawable.dot_selector)
            val layoutParams = LinearLayout.LayoutParams(LinearLayout.LayoutParams(width, width))
            if (i != 0) {
                layoutParams.leftMargin = width
            } else {
                dot.isSelected = true
            }
            indicator.addView(dot, layoutParams)
        }

        viewPager2.adapter = ViewPager2Adapter(this, mImgIds)
        //设置监听
        viewPager2.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
            override fun onPageScrolled(
                position: Int,
                positionOffset: Float,
                positionOffsetPixels: Int
            ) {
                indicator.forEachIndexed { index, view ->
                    view.isSelected = index == position
                }
            }
        })
    }
}
class ViewPager2Adapter(private val context: Context, private val mImgIds: IntArray) :
    RecyclerView.Adapter<ViewPager2Adapter.MyViewHolder>() {

    private var inflater: LayoutInflater = LayoutInflater.from(context)

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        return MyViewHolder(inflater.inflate(R.layout.item_image_view, parent, false))
    }

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        holder.imageView.setImageResource(mImgIds[position])
    }

    override fun getItemCount(): Int {
        return mImgIds.size
    }

    class MyViewHolder(private val itemView: View) : RecyclerView.ViewHolder(itemView) {
        public val imageView: ImageView = itemView as ImageView
    }
}

ViewPager2+TabLayout+Fragment

在这里插入图片描述

class TabActivity : BaseActivity() {
    private lateinit var tabLayout: TabLayout
    private lateinit var viewPager2: ViewPager2

    private val titles = arrayOf("one", "two", "three", "four", "five", "six", "seven", "eight")
    private val fragmentList = arrayListOf<TextFragment>().apply {
        titles.forEachIndexed { index, s ->
                               add(TextFragment.newInstance(s))
                              }
    }

    companion object {
        fun start(context: Context) {
            val intent = Intent(context, TabActivity::class.java).apply {
                putExtra(KEY_TITLE, "ViewPager2+TabLayout+Fragment")
            }
            context.startActivity(intent)
        }
    }

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

        // offscreenPageLimit默认不开启预加载
        // offscreenPageLimit设置为1表示缓存前一页,预加载下一页,包含当前页一共三页
        viewPager2.offscreenPageLimit = 1
        viewPager2.adapter = TabAdapter(this, fragmentList)
        TabLayoutMediator(
            tabLayout,
            viewPager2,
            object : TabLayoutMediator.TabConfigurationStrategy {
                override fun onConfigureTab(tab: TabLayout.Tab, position: Int) {
                    tab.text = titles[position]
                }
            }
        ).attach()
    }

    private fun initView() {
        tabLayout = findViewById(R.id.tabLayout)
        viewPager2 = findViewById(R.id.viewPager2)
    }
}
class TabAdapter(
    fragmentActivity: FragmentActivity,
    private val fragmentList: ArrayList<TextFragment>
) : FragmentStateAdapter(fragmentActivity) {
    override fun getItemCount(): Int = fragmentList.size

    override fun createFragment(position: Int): Fragment {
        return fragmentList[position]
    }
}

代码下载

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Viewpager切换动画可以通过在Android 3.0及以上版本中使用官方提供的API来实现。你可以使用`setPageTransformer`方法来为Viewpager增加切换动画效果。例如,你可以使用`ZoomOutPageTransformer`来实现缩放效果,代码如下:`mViewpager.setPageTransformer(true, new ZoomOutPageTransformer());`\[1\] 此外,你也可以参考鸿洋大神的博客,他总结了一篇文章来介绍如何实现Viewpager的切换动画。你可以仿照他的方法来实现你想要的效果。他的博客中提到了重写`setPageTransformer`方法,并使用`DepthPageTransformer`来实现深度效果的切换动画\[2\]。所以你可以使用以下代码来实现深度效果的切换动画:`viewPager.setPageTransformer(true, new DepthPageTransformer());`\[3\]。希望这些信息对你有帮助! #### 引用[.reference_title] - *1* [Viewpager两种实现切换动画的方式](https://blog.csdn.net/xiaoshuxgh/article/details/89355165)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [ViewPager切换动画的方法](https://blog.csdn.net/qq_32722239/article/details/61918423)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [ViewPager 16种切换动画,早晚能用到](https://blog.csdn.net/AndroidMsky/article/details/50248937)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值