Kotlin版RecyclerView加item点击处理

之前个google定义kotlin为Android一级语言,小弟之前对kotlin也并不是很了解所以去了解之后写了一份有关kotlin版的RecyclerView希望对新学习kotlin的人有一些帮助。

在使用kotlin之前我们要对在As中下载kotlin的插件在重启As之后新建一个Android项目在As的code栏最下面有一个convert Java file to kotlin file 转换之后再Activity会有一个config的设置,它会帮你设置完kotlin在module的build.gradle和全局build.gradle中设置kotlin的一系列配置

我们来看看我们的MainActivity页面的操作

package com.example.liuqiang.kotlinforandroid

import android.app.Activity
import android.content.Context
import android.os.Bundle
import android.os.Handler
import android.os.Message
import android.support.v7.widget.LinearLayoutManager
import android.support.v7.widget.RecyclerView
import android.util.Log
import android.view.View
import android.widget.Button
import android.widget.Toast
import com.google.gson.*
import com.google.gson.reflect.TypeToken
import okhttp3.*
import java.io.IOException


class MainActivity : Activity() {
    //创建变量此处使用的网络访问是基于okhttp的
    var mOkHttpClient: OkHttpClient? = null
    var request: Request? = null;
    var body: FormBody? = null;
    var btn_back: Button? = null;
    val context: Context = this
    var recyclerView: RecyclerView? = null;
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        //加载数据
        loadData()
        //初始化控件和绑定事件
        btn_back = findViewById(R.id.btn_back) as Button;
        recyclerView = findViewById(R.id.recyclerView) as RecyclerView;
        btn_back!!.setOnClickListener {
            finish()
        }
    }

    fun loadData() {
        val path = "您的接口地址"
        //kotlin不需要new 可直接写
        mOkHttpClient = OkHttpClient()
        //对应参数
        body = FormBody.Builder()
                .addEncoded("key", "val")
                .build()
        request = Request.Builder().url(path).post(body).build()
        //此处是重写callback类也可以自己定义一个class类实现Callback
        mOkHttpClient!!.newCall(request).enqueue(object : Callback {
            override fun onFailure(call: Call?, e: IOException?) {
            }

            override fun onResponse(call: Call?, response: Response?) {
                if (response != null) {
                    if (response.isSuccessful) {
                        //拿到服务器返回参数
                        var response = response.body().string();
                        Log.d("###",response);
                        try {
                            //使用Gson解析返回数据
                            var gson: Gson = Gson()
                            var json: JsonParser= JsonParser();
                            var jent: JsonElement=json.parse(response) as JsonElement;
                            var job:JsonObject = jent.asJsonObject;
                            var jar: JsonArray;
                            jar = job.getAsJsonArray("rows");
                            //拿到gson类解析tyep
                            val turnsType = object : TypeToken<ArrayList<TestInfo>>() {}.type
                            val list: ArrayList<TestInfo>;
                            //完成解析
                            list = gson.fromJson<ArrayList<TestInfo>>(jar, turnsType);
                            //通知recyclerView
                            var message = Message();
                            message.obj = list;
                            hand.sendMessage(message);
                        } catch(e: Exception) {
                            println(e.message);
                        }

                    }
                }
            }

        });

    }
    //完成recyclerView适配
    var hand = object : Handler() {
        override fun handleMessage(msg: Message?) {
            super.handleMessage(msg)
            val list: ArrayList<TestInfo>;
            list = msg!!.obj as ArrayList<TestInfo>
            recyclerView!!.layoutManager = LinearLayoutManager(context);
            recyclerView!!.adapter = TestAdapter(list, context,itemClick());
        }
    }
    //inner关键字可以方位外部类的参数
    //次类是处理recyclerView的点击事件的
    inner class itemClick: ItemClick{
        override fun OnItemClick(v: View, position: Int) {
            Toast.makeText(context,"你点击了第"+(position+1)+"个",Toast.LENGTH_LONG).show();
        }
    }

}

在adapter里面我们绑定了item点击接口的处理

package com.example.liuqiang.kotlinforandroid

import android.content.Context
import android.support.v7.widget.RecyclerView
import android.support.v7.widget.RecyclerView.Adapter
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import android.widget.Toast
import com.bumptech.glide.Glide
import com.example.liuqiang.kotlinforandroid.TestAdapter.MyHolder
import java.io.File

class TestAdapter : Adapter<MyHolder> {
    //定义参数
    var list: List<TestInfo>? = null;
    var contxt: Context? = null;
    //获得事件回调接口
    var item:ItemClick?=null;

    //初始化数据
    constructor(list: ArrayList<TestInfo>, contxt: Context,item:ItemClick) {
        this.list = list;
        this.contxt = contxt;
        this.item=item;
    }

    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): MyHolder {
        //得到itemView
        var v: View = LayoutInflater.from(contxt).inflate(R.layout.item, null, false);
        var holder = MyHolder(v);
        //为itemView绑定点击事件
        v.setOnClickListener(onClick());
        return holder;
    }

    override fun getItemCount(): Int {
        var size = list!!.size
        return size;
    }

    override fun onBindViewHolder(holder: MyHolder?, position: Int) {
        var name = list!!.get(position).username;
        holder!!.txtName.setText(name);
        var dept = list!!.get(position).deptname;
        var path = "您的图片地址;
        if(path.contains(".jpg")||path.contains(".png")){
            Glide.with(contxt)
                    .load(path)
                    .thumbnail(0.1f)//使用原图的10/1作为略缩图
                    .into(holder.image_head);
        }else{
            holder.image_head.setImageResource(R.drawable.mv);
        }
        //得到position防止滑动点击错位
        holder.itemView.setTag(position);
        holder.bonus.setText(dept);

    }
    
    //viewHolder

    public class MyHolder(itemView: View?) : RecyclerView.ViewHolder(itemView) {
        var image_head: ImageView = itemView!!.findViewById(R.id.image_head) as ImageView;
        var txtName: TextView = itemView!!.findViewById(R.id.txtName) as TextView;
        var bonus: TextView = itemView!!.findViewById(R.id.bonus) as TextView;
    }

    //调用接口回调
    inner class onClick:View.OnClickListener{
        override fun onClick(v: View?) {
            var positon:Int= v!!.getTag() as Int;
            if(item==null){
                Toast.makeText(contxt,"哈哈哈",Toast.LENGTH_LONG).show();
            }
            item!!.OnItemClick(v,positon);
        }

    }

}

itemView点击处理接口

package com.example.liuqiang.kotlinforandroid

import android.view.View

/**
 * Created by liuqiang on 2017/5/23.
 */
interface ItemClick {
    fun OnItemClick(v: View,position:Int);
}

实体类

package com.example.liuqiang.kotlinforandroid

import java.io.Serializable

/**
 * Created by liuqiang on 2017/5/21.
 */

//data 是数据类的关键字 默认给字段配置get和set方法
data class TestInfo(var username:String, var fileContent:String,var deptname:String): Serializable{

}
最后的utils类

package com.example.liuqiang.kotlinforandroid

import android.app.ProgressDialog
import android.content.Context

/**
 * Created by liuqiang on 2017/5/21.
 */
class Utils {
    var dialog:ProgressDialog?=null;
    fun showProgressDialog(context:Context,message:String,isFouse:Boolean){
        if(dialog==null){
            dialog=ProgressDialog(context);
        }
        dialog!!.setMessage(message);
        dialog!!.setCancelable(isFouse);
        dialog!!.setCanceledOnTouchOutside(isFouse);
        dialog!!.show();
    }

    fun cancelProgressDialog(){
        if(dialog!=null){
            dialog!!.dismiss();
            dialog=null;
        }
    }
}



Android中,Kotlin中的RecyclerView是一个用于显示列表数据的组件。当用户滚动或点击RecyclerView中的条目时,通常需要对这些事件进行监听以便处理相应的业务逻辑。以下是监听RecyclerView Item的方法: 1. **设置OnItemClickListener**: 使用`onItemClickListener`属性可以监听单击事件。首先,在Adapter里添一个接口: ```kotlin interface OnItemClickListener { fun onItemClick(position: Int) } ``` 然后,在Adapter初始化时绑定到Viewholder: ```kotlin class YourAdapter(private val listener: OnItemClickListener) : RecyclerView.Adapter<YourViewHolder>() { override fun onBindViewHolder(holder: YourViewHolder, position: Int) { holder.itemView.setOnClickListener { // 当item点击 listener.onItemClick(position) } } //... } ``` 2. **使用Kotlin扩展函数**: Kotlin提供了一种简洁的方式来简化监听操作,你可以创建一个扩展函数为RecyclerView点击事件: ```kotlin fun RecyclerView.itemClickHandler(callback: (Int) -> Unit): RecyclerView.OnItemTouchListener { return object : RecyclerView.OnItemTouchListener { override fun onInterceptTouchEvent(parent: RecyclerView, e: MotionEvent): Boolean { return when (e.actionMasked) { MotionEvent.ACTION_DOWN -> true else -> false } } override fun onTouchEvent(parent: RecyclerView, e: MotionEvent): Boolean { val clickedPosition = parent.pointToPosition(e.x, e.y) if (clickedPosition != RecyclerView.NO_POSITION) { callback(clickedPosition) } return false } } } // 在Adapter中使用这个扩展函数 yourRecyclerView.apply { itemClickHandler { position -> // 处理点击事件 } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值