Kotlin_ViewPager的简单使用

ViewPager的使用方法和RecyclerView (ListView) 的类似,对应PageAdapter

RecyclerView 参考: https://blog.csdn.net/whjk20/article/details/106950422

目录

1. 布局文件使用ViewPager

2. 创建ViewPager的条目(view_pager_item.xml)

3. 定义条目的使用的数据:

4. 创建适配器Adapter

4.1 构造函数传递数据

4.2 isViewFromObject & getCount 必须实现的

4.3 创建条目并且绑定数据

5.  Activity

5.1 初始化数据

5.2 创建适配器并设置给ViewPager


1. 布局文件使用ViewPager

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
    tools:context=".MainActivity">

    <androidx.viewpager.widget.ViewPager
        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

2. 创建ViewPager的条目(view_pager_item.xml)

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <ImageView
        android:id="@+id/image_view"
        android:layout_width="match_parent"
        android:src="@drawable/pic1"
        android:layout_height="300dp"
        android:scaleType="fitXY"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>
    <RadioButton
        android:id="@+id/radio_button"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/image_view"
        android:gravity="center_horizontal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</androidx.constraintlayout.widget.ConstraintLayout>

3. 定义条目的使用的数据:

和之前的RecyclerView一样: 参考: https://blog.csdn.net/whjk20/article/details/106950422

4. 创建适配器Adapter

4.1 构造函数传递数据

    private var datas: MutableList<UserData>
    private var context: Context

    // 1. 适配器持有数据的引用
    constructor(context: Context, datas: MutableList<UserData>) {
        this.datas = datas
        this.context = context
    }

4.2 isViewFromObject & getCount & destroyItem 必须实现的

    // 2.isViewFromObject & getCount 必须实现的
    override fun isViewFromObject(view: View, `object`: Any): Boolean {
          return view == `object`
    }

    override fun getCount(): Int {
        return datas.size
    }

新增注意:必须实现destroyItem 进行销毁,否正会抛出异常

08-11 09:43:41.394 22984 22984 E AndroidRuntime: java.lang.UnsupportedOperationException: Required method destroyItem was not overridden

    @Override
    public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
        container.removeView((View) object);
    }

 

4.3 创建条目并且绑定数据

(1) 创建条目(加载item view)

  (2) 绑定数据

(3)添加到容器中 (container.addView) , 否则是不会显示内容的

    // 3。 相当于创建条目并且绑定数据 onCreateViewHolder &onBindViewHolder -- 直接创建也行
    override fun instantiateItem(container: ViewGroup, position: Int): View{
//        var imageView = ImageView(context)
//        imageView.setImageDrawable(context.resources.getDrawable(datas[position].userImageId))
//        container.addView(imageView)

        val view = View.inflate(context, R.layout.view_pager_item, null)
        view.image_view.setImageResource(datas[position].userImageId)
        container.addView(view)
        return view
    }

    override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {
        container.removeView(`object` as View)
    }

例如 ViewPager 只有三页的话, 

(1) 默认会先加载两页, 即一开始调用两次  instantiateItem, 其中position 分别为 0 和1 

(2) 当滑动到第二页时, 会再调用一次instantiateItem,此时传入的position为2, 即预先加载第三页。

(3) 当滑动到第三页时, 会调用destoryItem, 销毁第一页

以此类推,保证这种情况下,当前只有两页缓存。

5.  Activity

5.1 初始化数据

    private fun initDatas() {
        for (index in 0 until USER_NAMES.size) {
            datas.add(
                index,
                UserData(
                    context.getString(USER_NAMES[index]), PIC_IDS[index]
                )
            )
        }
    }

5.2 创建适配器并设置给ViewPager

    private fun showViewPager() {
        viewPagerAdapter = ViewPagerAdapter(context, datas)
        view_pager.adapter = viewPagerAdapter
    }

最后,附上大神的帖子:https://juejin.im/post/5a4c2f496fb9a044fd122631

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值