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中注册好网络权限,即可测试

效果图如下:

代码地址:https://github.com/yanjiepeng/DataBindingDemo/tree/master/app/src/main/java/com/example/databindingdemo/viewpager

DataBinding + Kotlin +Viewpager的更多相关文章

  1. 配置Kotlin环境(DataBinding)

    1.安装Kotlin插件 在plugin中搜索kotlin,安装两个kotlin插件,重新启动Android Studio.2.build.gradle(project level) buildscr ...

  2. Kotlin 特性 语法糖 优势 扩展 高阶 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  3. Kotlin从入门到掉坑里

    为什么要用Kotlin,和Java完全兼容,相互之间引用完全不是问题,所有没有什么负担. 使用Kotlin已经近一个月,基本上看完了语法就上正式项目了,期间几次准备放弃,最终坚持下来了.关于Kotli ...

  4. android 2048游戏、kotlin应用、跑马灯、动画源码

    Android精选源码 2048游戏源码 android实现获取号码归属地和其他信息诈骗.骚扰 android kotlin仿开眼app源码 android多种reveal动画效果 android K ...

  5. 爽翻天!告别Java。一起来使用kotlin开发完整客户端

    必须写在前面:从Java转向Kotlin,只需要几天时间! 本篇是kotlin开发Android系列教程的最后一篇.前面几篇介绍了kotlin的基本语法.与java的不同之处等.在本篇文章中,将使用到 ...

  6. Kotlin : Retrofit + RxAndroid + Realm

    https://jqs7.com/kotlin-retrofit-rxandroid-realm/ 原作者:Ahmed Rizwan 原文链接:Kotlin : Retrofit + RxAndroi ...

  7. Kotlin入门(24)如何自定义视图

    Android提供了丰富多彩的视图与控件,已经能够满足大部分的业务需求,然而计划赶不上变化,总是有意料之外的情况需要特殊处理.比如PagerTabStrip无法在布局文件中指定文本大小和文本颜色,只能 ...

  8. Kotlin 学习使用之旅(二)

    为什么从二开始呢?再此之前已经有了一篇了,那是刚知道kotlin的时候草(chao)来(chao)的并且学习一篇, 这次是自己在项目中正式使用并且遇到的一些问题记录,供kotlin新入门的童鞋参考,避 ...

  9. DataBinding 笔记

    DataBinding 笔记 android DataBinding notes 那些年踩过的坑 问题 那些年踩过的坑 非 public 类型的变量,getter 方法必须有,没有就会报错:Could ...

随机推荐

  1. 《第一行代码》之——1.Android简介

    Android简介 Android系统架构 (图片源自维基百科) Android大致分为四层架构,五块区域. Linux内核层 Android系统基于Linux2.6,这一层为Android设备的各种 ...

  2. hdu2044 dp

    /* 每一种情况都可以由周围2个点得出 */ #include<stdio.h> int main() { __int64 dp[]; int i,t,l,r; dp[]=; dp[]=; ...

  3. idea列编辑模式

    当我们想要选中一列时,在eclipse中alt+shit+a就可以选中一列了, 在网上很多的idea中列编辑的使用,但是对我的电脑却不管用,也不太清楚在哪里设置 最后无奈乱试一通,结果找到了 alt+ ...

  4. Java练习 SDUT-2561_九九乘法表

    九九乘法表 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 九九乘法表是数学学习的基础,今天我们就来看看乘法表的相关问题 ...

  5. php上传文件与图片到七牛的实例详解

    上传文件到七牛最简单的方式就是使用七牛官方最新的SDK 用composer安装PHP SDK composer require qiniu/php-sdk 上传文件到七牛 use Qiniu\Auth ...

  6. SharpDX初学者教程第4部分:绘制三角形

    原文 http://www.johanfalk.eu/blog/sharpdx-beginners-tutorial-part-4-drawing-a-triangle 现在我们有了一个Direct3 ...

  7. 快速完成智能数据构建,Dataphin公共云版本全面解读

    公测两个月,Dataphin公共云版本已经受到了阿里云上众多轻量级用户的关注.事实上,Dataphin作为一款大数据智能构建与管理的产品,其核心功能是面向各行各业大数据建设.管理及应用诉求,一站式提供 ...

  8. Hbase数据模型 列族

  9. Android教程 -04 启动其它Activity,静态工厂设计模式传递数据

    视频建议采用超清模式观看, 欢迎点击订阅我的优酷 意图 Intent 一个应用程序肯定不只有一个界面,如何切换到其它界面,只时候就需要启动其它的Activity.启动Activity有多种方式.我在这 ...

  10. SuperSocket通过 SessionID 获取 Session

    前面提到过,如果你获取了连接的 Session 实例,你就可以通过 "Send()" 方法向客户端发送数据.但是在某些情况下,你无法直接获取 Session 实例. SuperSo ...