DataBinding + Kotlin +Viewpager
1.创建viewmodel,其中BindAdapter的方法需要是静态方法,因此需要加@JvmStatic,"app:img"相当于一个自定义属性,后面xml中会用到,当app:img设置的值发生改变的时候会触发这里的setImage方法,这里的BR要使用baseAdapter包里的BR
class ViewPagerItemModel : BaseObservable() {
    @get:Bindable
    var imageUrl: String = ""
        set(value) {
            field = value
            notifyPropertyChanged(BR.imageUrl)
        }
    companion object {
        @BindingAdapter("app:img")
        @JvmStatic
        fun setImage(view: ImageView, img: String) {
            Glide.with(view.context).load(img).into(view)
        }
    }
}
2.创建ViewPager每个Item的布局文件,使用Databinding
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"> <data> <import type="com.example.databindingdemo.viewpager.viewmodel.ViewPagerItemModel" /> <variable
name="itemModel"
type="ViewPagerItemModel" /> </data> <ImageView
android:id="@+id/iv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitXY"
app:img="@{itemModel.imageUrl}" /> </layout>
3.创建Viewpager的适配器,使用databingding后直接在 instantiateItem 中返回binding即可,在isViewFromObject通过binding可以获取根布局
class CommonViewPager<T> : PagerAdapter {
    var context: Context? = null
    var list: List<T>? = null
    var variableId: Int? = null
    var layoutId: Int? = null
    var inflater: LayoutInflater? = null
    constructor(
        context: Context?,
        list: List<T>?,
        variableId: Int?,
        layoutId: Int?,
        inflater: LayoutInflater?
    ) : super() {
        this.context = context
        this.list = list
        this.variableId = variableId
        this.layoutId = layoutId
        this.inflater = inflater
    }
    override fun isViewFromObject(view: View, `object`: Any): Boolean {
        val binding: ViewDataBinding = `object` as ViewDataBinding
        return view == binding.root
    }
    override fun getCount(): Int {
        return list!!.size
    }
    override fun instantiateItem(container: ViewGroup, position: Int): Any {
        //返回databingding绑定的view
        var binding: ViewDataBinding =
            DataBindingUtil.inflate(inflater!!, layoutId!!, container, true)
        binding.setVariable(variableId!!, list!![position])
        //这里我们返回binding对象 这个binding对象是isViewFromObject 和destoryItem方法中的引用
        return binding
    }
    override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {
        //移除binding 对应的view
        var binding: ViewDataBinding = `object` as ViewDataBinding
        container.removeView(binding.root)
    }
}
4.测试,创建布局,Activity中传入测试数据,通过DataBinding设置adapter
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"> <FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"> <androidx.viewpager.widget.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="12345"
/>
</FrameLayout> </layout>
class ViewPagerActivity : AppCompatActivity() {
    private lateinit var viewpager: ViewPager
    private val guide = arrayOf(
        "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1576663390033&di=730d0a924db46019357729ad3962ec63&imgtype=jpg&src=http%3A%2F%2Fimg3.imgtn.bdimg.com%2Fit%2Fu%3D3992817968%2C1397776076%26fm%3D214%26gp%3D0.jpg",
        "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1576663366853&di=8cf4396b2368802337fe5a6536bbb009&imgtype=0&src=http%3A%2F%2Fimg.zcool.cn%2Fcommunity%2F0175cd58b77c62a801219c77391932.png%401280w_1l_2o_100sh.png",
        "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1576663366853&di=62406d7412779ddfabf9690ba2647edc&imgtype=0&src=http%3A%2F%2Fhbimg.b0.upaiyun.com%2Fbc608c9430155517e6fd15f3cc950f625cdb774b16a09-dZ7fZC_fw658",
        "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1576663551403&di=52c6783c3745a97a7aa689e29951c6d0&imgtype=jpg&src=http%3A%2F%2Fimg1.imgtn.bdimg.com%2Fit%2Fu%3D2597631641%2C1350168820%26fm%3D214%26gp%3D0.jpg"
    )
    lateinit var lists: MutableList<ViewPagerItemModel>
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = DataBindingUtil.setContentView<ActivityViewPagerBinding>(this, R.layout.activity_view_pager)
        viewpager = binding.viewpager
        lists = ArrayList()
        initData()
        val adapter = CommonViewPager<ViewPagerItemModel>(
            this,
            lists,
            BR.itemModel,
            R.layout.view_pager_item,
            layoutInflater
        )
        viewpager.adapter = adapter
    }
    private fun initData() {
        for (i in guide) {
            val v = ViewPagerItemModel()
            v.imageUrl = i
            lists.add(v)
        }
    }
}
使用Glide加载,因此在Manifest中注册好网络权限,即可测试
效果图如下:

DataBinding + Kotlin +Viewpager的更多相关文章
- 配置Kotlin环境(DataBinding)
		1.安装Kotlin插件 在plugin中搜索kotlin,安装两个kotlin插件,重新启动Android Studio.2.build.gradle(project level) buildscr ... 
- Kotlin 特性 语法糖 优势 扩展 高阶 MD
		Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ... 
- Kotlin从入门到掉坑里
		为什么要用Kotlin,和Java完全兼容,相互之间引用完全不是问题,所有没有什么负担. 使用Kotlin已经近一个月,基本上看完了语法就上正式项目了,期间几次准备放弃,最终坚持下来了.关于Kotli ... 
- android 2048游戏、kotlin应用、跑马灯、动画源码
		Android精选源码 2048游戏源码 android实现获取号码归属地和其他信息诈骗.骚扰 android kotlin仿开眼app源码 android多种reveal动画效果 android K ... 
- 爽翻天!告别Java。一起来使用kotlin开发完整客户端
		必须写在前面:从Java转向Kotlin,只需要几天时间! 本篇是kotlin开发Android系列教程的最后一篇.前面几篇介绍了kotlin的基本语法.与java的不同之处等.在本篇文章中,将使用到 ... 
- Kotlin : Retrofit + RxAndroid + Realm
		https://jqs7.com/kotlin-retrofit-rxandroid-realm/ 原作者:Ahmed Rizwan 原文链接:Kotlin : Retrofit + RxAndroi ... 
- Kotlin入门(24)如何自定义视图
		Android提供了丰富多彩的视图与控件,已经能够满足大部分的业务需求,然而计划赶不上变化,总是有意料之外的情况需要特殊处理.比如PagerTabStrip无法在布局文件中指定文本大小和文本颜色,只能 ... 
- Kotlin 学习使用之旅(二)
		为什么从二开始呢?再此之前已经有了一篇了,那是刚知道kotlin的时候草(chao)来(chao)的并且学习一篇, 这次是自己在项目中正式使用并且遇到的一些问题记录,供kotlin新入门的童鞋参考,避 ... 
- DataBinding 笔记
		DataBinding 笔记 android DataBinding notes 那些年踩过的坑 问题 那些年踩过的坑 非 public 类型的变量,getter 方法必须有,没有就会报错:Could ... 
随机推荐
- 【JZOJ2224】【NOI2006】最大获利
			题目描述 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU集团旗下的CS&T通讯公司在新一代通讯技术血战的前夜,需要做太多的准备工作,仅就站址选择一项,就需要完成 ... 
- Python基础:18类和实例之二
			1:绑定和非绑定 当存在一个实例时,方法才被认为是绑定到那个实例了.没有实例时方法就是未绑定的.在很多情况下,调用的都是一个绑定的方法. 调用非绑定方法并不经常用到,其中一个主要的场景是:派生一个子类 ... 
- 自动编码(AE)器的简单实现
			一.目录 自动编码(AE)器的简单实现 一.目录 二.自动编码器的发展简述 2.1 自动编码器(Auto-Encoders,AE) 2.2 降噪自编码(Denoising Auto-Encoders, ... 
- @bzoj - 4356@ Ceoi2014 Wall
			目录 @description@ @solution@ @accepted code@ @details@ @description@ 给出一个N*M的网格图,有一些方格里面存在城市,其中首都位于网格 ... 
- mysql 忘记root密码的处理办法
			参考地址: https://blog.csdn.net/vv19910825/article/details/82979563 1.修改配置文件mysql\bin\my.ini 在文本 [mysql ... 
- HZOJ 题
			首先对于n<=100的点,直接暴力dp,f[i][j][k]表示时间为i,在i,j位置的方案数,枚举转移即可,期望得分40. ) { ) { f[][][]=; ;i<=n;i++) ;x ... 
- 注意 Laravel 清除缓存 php artisan cache:clear 的一个坑
			Laravel 的命令 php artisan cache:clear 用来清除各种缓存,如页面,Redis,配置文件等缓存,它会清空 Redis 数据库的全部数据,比如默认使用的 Redis 的 数 ... 
- 为什么有时候Css样式表某个属性引用不成功?
			首次使用博客,很多东西都在探索,第一篇文章也不知道发布点什么,就随便写写,是在word里面写的,也懒得排版,将就这用吧. 闲着没事找了酷狗的API写了个简单的静态网页,完成了搜索,展示,播放功能.就想 ... 
- Rikka with Mista  线段树求交点个数
			由于上下线段是不可能有交点的 可以先看左右线段树,按照y递增的顺序,对点进行排序. 升序构造,那么对于从某一点往下的射线,对于L,R进行区间覆盖,线段交点个数就是单点的被覆盖的次数. 降序构造,那么对 ... 
- Ubuntu 开机自动挂载NTFS分区
			先安装两个软件,ntfs-3g 和 ntfs-config,前面那个最新版本的Ubuntu已经自带了,所以只需要安装ntfs-config. 输入 sudo apt-get install ntfs- ... 
