ViewPager的使用方法和RecyclerView (ListView) 的类似,对应PageAdapter
RecyclerView 参考: https://blog.csdn.net/whjk20/article/details/106950422
目录
2. 创建ViewPager的条目(view_pager_item.xml)
4.2 isViewFromObject & getCount 必须实现的
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
}