Kotlin系列二(Kotlin实现RecyclerView加item点击处理)

原创 2018年04月16日 10:30:36

上一篇讲了kotlin基础语法,这一篇讲的是kotlin在Android开发中的实际应用,希望对正在学习的小伙伴有帮助。谢谢!

添加的依赖:

/*RecyclerView*/
implementation 'com.android.support:recyclerview-v7:26.1.0'
/*retrofit*/
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
/*Okhttp*/
compile 'com.squareup.okhttp3:okhttp:3.2.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.2.0'
/*rxjava*/
compile 'io.reactivex:rxjava:1.1.0'
compile 'io.reactivex:rxandroid:1.1.0'
/*glide*/
compile 'com.github.bumptech.glide:glide:3.7.0'

Activity代码:

class MainActivity: AppCompatActivity() {

    val BASE_URL: String = "http://112.124.22.238:8081"

    private var mAPIService: APIService? = null

    var mDataList: ArrayList<MainDataBean> = ArrayList()

    init {
        mAPIService = initRetrofitClient()
    }

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

        rv_main_content.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
        rv_main_content.adapter = MainRecyclerAdapter(this, mDataList, ClickCallback())
        refreshData()
    }

    private fun refreshData(){
        //本地伪数据
        //return (0..25).mapTo(ArrayList()) { MainDataBean("${it}".toInt(), "test data $it", 0, "" )}
        //网络请求数据
        mAPIService!!.onRequestBannerData(1)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe({ responseData ->
                    mDataList.addAll(responseData)
                    rv_main_content.adapter.notifyDataSetChanged()
                })
    }

    inner class ClickCallback: OnClickCallback {
        override fun onClick(view: View, position: Int) {
            val tvId: TextView = view.findViewById(R.id.tv_main_item_id)
            val tvName: TextView = view.findViewById(R.id.tv_main_item_name)
            showToast(this@MainActivity, "position:$position, name:${tvId.text},name:${tvName.text}")
        }
    }

    //显示Toast
    private fun showToast(context: Context, message: String, duration: Int = Toast.LENGTH_SHORT) {
        Toast.makeText(context, message, duration).show()
    }

    //Retrofit
    private fun initRetrofitClient(): APIService {
        return Retrofit.Builder()
                        .baseUrl(BASE_URL)
                        .client(initOkHttpClient())
                        .addConverterFactory(GsonConverterFactory.create())
                        .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                        .build()
                        .create(APIService::class.java)
    }

    //OkhttpClient
    private fun initOkHttpClient(): OkHttpClient {
        return OkHttpClient.Builder()
                        .connectTimeout(5, TimeUnit.SECONDS)
                        .writeTimeout(5, TimeUnit.SECONDS)
                        .readTimeout(5, TimeUnit.SECONDS)
                        .build()
    }
}

Adapter代码:

class MainRecyclerAdapter(context: Context, dataBeanList: ArrayList<MainDataBean>, onClickCallback: OnClickCallback)
    : RecyclerView.Adapter<MainRecyclerAdapter.MainRecyclerViewHolder>() {

    private var mContext = context
    private var mDataBeanList = dataBeanList
    private var mOnClickCallback = onClickCallback

    override fun onBindViewHolder(holder: MainRecyclerViewHolder?, position: Int) {
        var mainDataBean: MainDataBean = mDataBeanList[position]
        Glide.with(mContext).load(mainDataBean.imgUrl).into(holder?.tvImg)
        holder?.tvId?.text = mainDataBean.id.toString()
        holder?.tvName?.text = mainDataBean.name
        holder?.itemView?.tag = position
    }

    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): MainRecyclerViewHolder {
        val view: View = LayoutInflater.from(mContext).inflate(R.layout.item_main, parent, false)
        view.setOnClickListener(ClickListener())
        return MainRecyclerViewHolder(view)
    }

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

    inner class MainRecyclerViewHolder(view: View): RecyclerView.ViewHolder(view) {
        var tvImg: ImageView = view.findViewById(R.id.iv_main_item_img)
        var tvId: TextView = view.findViewById(R.id.tv_main_item_id)
        var tvName: TextView = view.findViewById(R.id.tv_main_item_name)
    }

    inner class ClickListener: View.OnClickListener {
        override fun onClick(v: View?) {
            mOnClickCallback.onClick(v!!, v.tag as Int)
        }
    }
}

处理Item点击回调的接口:

interface OnClickCallback {
    fun onClick(view: View, position: Int)
}

Retrofit的api接口:

interface APIService {
    @GET("/course_api/banner/query?")
    fun onRequestBannerData(@Query("type") id: Int): Observable<List<MainDataBean>>
}

Data class:

data class MainDataBean(var id: Int, var name: String, var type: Int, var imgUrl: String)
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yangyin3096/article/details/79957330

让ActiveX控件设计状态在容器中的大小锁定!

让ActiveX控件设计状态时在容器中的大小锁定,可以使用下面这个宏,该宏为无窗口的ActiveX控件,在vc++.net(atl7.0)下编译成功.#ifndef __CONTROL_NO_WIND...
  • lu_zi
  • lu_zi
  • 2002-11-04 13:09:00
  • 836

Kotlin版RecyclerView加item点击处理

之前个google定义kotlin为Android一级语言,小弟之前对kotlin也并不是很了解所以去了解之后写了一份有关kotlin版的RecyclerView希望对新学习kotlin的人有一些帮助...
  • fire_nirvana
  • fire_nirvana
  • 2017-05-23 20:56:55
  • 1485

3.2.2 完全掌握在 Kotlin 中实现 RecyclerView

点此进入:从零快速构建APP系列目录导图点此进入:UI编程系列目录导图点此进入:四大组件系列目录导图点此进入:数据网络和线程系列目录导图如果你对RecyclerView还没有完全了解,可参看我的这一篇...
  • ComWill
  • ComWill
  • 2017-09-22 11:23:12
  • 698

Kotlin实战(二): 实现RecyclerView多种Item布局

前言RecyclerView出来很久了,可以说一出来就将ListView给比下去了,当然,Recyclerview有它的好,ListView的好,并不是说一定要用Recyclerview,最适用自己项...
  • u011976726
  • u011976726
  • 2017-10-08 18:08:18
  • 390

在Android中使用kotlin(recyclerview的使用)

随着google宣布kotlin作为官方开发语言,在Android中使用kotlin的趋势也越来越明显,下面是我们在项目中常用的控件(recyclerview),那么我们在项目中怎么来将Java代码改...
  • small_technical
  • small_technical
  • 2017-05-25 09:28:05
  • 3588

在kotlin中使用RecyclerView

Kotlin 是一个基于 JVM 的新的编程语言,由 JetBrains 开发。Kotlin可以编译成Java字节码,也可以编译成JavaScript,方便在没有JVM的设备上运行。JetBrains...
  • darren573
  • darren573
  • 2017-06-12 14:36:10
  • 502

Kotlin和RecyclerView的一个demo

Kotlin和RecyclerView的一个demo Kotlin最近比较火,我简单学了一下,写了个小demo,RecyclerView的. 1.使用到的东西 语言:Kotlin 不会配置的点这里...
  • xfhy_
  • xfhy_
  • 2017-08-04 11:15:10
  • 739

RecyclerView实现Item点击事件方法三/四

此系列文章隔上次发布有一段时间,原因就是懒(其实是比较忙),今天来说下剩下的两种方法,如何优雅的实现 对于方法三我这里就不说了,因为有很多文章都有说明,那就是基于RecyclerView.OnItem...
  • qJay_Dev
  • qJay_Dev
  • 2016-08-30 20:41:46
  • 1003

Android中Kotlin的学习(点击事件、跳转、for循环、RecyclerView、回调)

刚刚学习Kotlin,有什么不对的地方请见谅。 首先属性的声明中有两个很重要的关键字: var  和  val。 例如: var a = "hello" val b = "hello"区别是什么呢? ...
  • YuGuo_TianQing
  • YuGuo_TianQing
  • 2017-06-15 11:00:08
  • 3378

Kotlin入门系列教程—RecyclerView

首先是网络请求 先看代码 异步网络请求 很简单的网络请求,就一句话 URL(url).readText() 注意kotlin中try...catch的写法 ...
  • weixin_37730482
  • weixin_37730482
  • 2017-06-05 14:23:27
  • 1496
收藏助手
不良信息举报
您举报文章:Kotlin系列二(Kotlin实现RecyclerView加item点击处理)
举报原因:
原因补充:

(最多只允许输入30个字)