Kotlin RecyclerView的點擊事件

Java代碼寫了n多行想鹰,最近學(xué)習(xí)Kotlin語言黔牵,有點不太順手斗蒋,但最后你會發(fā)現(xiàn)是真的簡潔坚洽。下面簡單記錄了一下Kotlin編寫的關(guān)于RecyclerView控件的使用戈稿。

學(xué)習(xí)到什么

  • Kotlin的Android語法
  • Kotlin的接口回調(diào)
  • RecyclerView的點擊事件
  • RecyclerView的分割線

Kotlin接口回調(diào)+點擊事件

Adapter中的聲明:

private lateinit var onItemClickListener: OnItemClickListener

fun setOnItemClickListener(listener: OnItemClickListener) {
    this.onItemClickListener = listener
}

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    holder.tv_item.text = data?.get(position)

    holder.tv_item.setOnClickListener {
        onItemClickListener?.onItemClick(holder.itemView, position)
    }

    holder.tv_item.setOnLongClickListener {
        onItemClickListener?.onItemLongClick(holder.itemView, position)
        true
    }
}

interface OnItemClickListener{
    fun onItemClick(view: View, position: Int)
    fun onItemLongClick(view: View, position: Int)
}

Activity中的回調(diào):

adapter?.setOnItemClickListener(object: MyAdapter.OnItemClickListener {
    override fun onItemClick(view: View, position: Int) {
        showToast("click " + position + " item")
    }

    override fun onItemLongClick(view: View, position: Int) {
        showToast("long click " + position + " item")
    }
})
recyclerview_click.jpg

完整代碼:

MainActivity

class MainActivity: AppCompatActivity() {

    private var myAdapter: MyAdapter? = null
    private var myLayoutManager: LinearLayoutManager? = null

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

        myLayoutManager = LinearLayoutManager(this)
        myAdapter = MyAdapter(this, initData())
        my_recycler_view.layoutManager = myLayoutManager
        my_recycler_view.adapter = myAdapter
        my_recycler_view.addItemDecoration(RecycleViewDivider(this, LinearLayoutManager.VERTICAL))

        setOnClickListener()

        myAdapter?.setOnItemClickListener(object: MyAdapter.OnItemClickListener {
            override fun onItemClick(view: View, position: Int) {
                showToast("click " + position + " item")
            }

            override fun onItemLongClick(view: View, position: Int) {
                showToast("long click " + position + " item")
            }
        })
    }

    fun setOnClickListener(){
        rv_add_item.setOnClickListener{
            myAdapter?.addItem()
            myLayoutManager?.scrollToPosition(0)
        }

        rv_delete_item.setOnClickListener{
            myAdapter?.deleteItem()
        }
    }

    private fun initData(): ArrayList<String> {
        var list = ArrayList<String>()
        var temp = "  item"
        for (i in 1..30){
            list.add(i.toString() + temp)
        }

        return list
    }

    private fun showToast(message: String){
        Toast.makeText(applicationContext,message, Toast.LENGTH_SHORT).show()
    }
}

MyAdapter

class MyAdapter: RecyclerView.Adapter<MyAdapter.ViewHolder>{

    private var context: Context
    private var data: ArrayList<String>
    private lateinit var onItemClickListener: OnItemClickListener

    constructor(context: Context, data: ArrayList<String>) : super() {
        this.context = context
        this.data = data
    }

    fun setOnItemClickListener(listener: OnItemClickListener) {
        this.onItemClickListener = listener
    }

    fun addItem(){
        if(data == null)
            data = ArrayList<String>()
        data.add(0, "我是新添加的 item")
        notifyDataSetChanged()
    }

    fun deleteItem(){
        if(data == null || data.isEmpty())
            return
        data.removeAt(0)
        notifyDataSetChanged()
    }

    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder{
        var v = LayoutInflater.from(parent?.context).inflate(R.layout.view_item, parent, false)

        var viewHolder = ViewHolder(v)
        return viewHolder
    }

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

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.tv_item.text = data?.get(position)

        holder.tv_item.setOnClickListener {
            onItemClickListener?.onItemClick(holder.itemView, position)
        }

        holder.tv_item.setOnLongClickListener {
            onItemClickListener?.onItemLongClick(holder.itemView, position)
            true
        }
    }

    class ViewHolder : RecyclerView.ViewHolder{
        var tv_item : TextView

        constructor(itemView: View) : super(itemView){
            tv_item = itemView.findViewById(R.id.tv_item)
        }
    }

    interface OnItemClickListener{
        fun onItemClick(view: View, position: Int)
        fun onItemLongClick(view: View, position: Int)
    }
}

RecycleViewDivider

class RecycleViewDivider: RecyclerView.ItemDecoration {

    private var mDivider: Drawable? = null
    private var mOrientation: Int? = null

    constructor(context: Context, mOrientation: Int) {
        val a = context.obtainStyledAttributes(ATTRS)
        mDivider = a.getDrawable(0)
        a.recycle()
        setOrientation(mOrientation)
    }


    private fun setOrientation(orientation: Int){
        if(orientation != LinearLayoutManager.VERTICAL
                && orientation != LinearLayoutManager.HORIZONTAL)
            throw IllegalAccessException(".....")

        mOrientation = orientation
    }

    override fun onDraw(c: Canvas, parent: RecyclerView, state: RecyclerView.State?) {
        super.onDraw(c, parent, state)

        if (mOrientation == LinearLayoutManager.VERTICAL) {
            drawVertical(c, parent)
        } else {
            drawHorizontal(c, parent)
        }
    }

    // 獲取分割線尺寸
    override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State?) {
        super.getItemOffsets(outRect, view, parent, state)

        if(mOrientation == LinearLayoutManager.VERTICAL)
            outRect.set(0,0,0,mDivider!!.intrinsicHeight)
        else
            outRect.set(0,0,mDivider!!.intrinsicWidth,0)
    }


    fun drawVertical(c: Canvas, parent: RecyclerView){
        val left = parent.paddingLeft
        val right = parent.width - parent.paddingRight
        val childCount = parent.childCount
        for (i in 0 until childCount) {
            val child = parent.getChildAt(i)
            val params = child
                    .layoutParams as RecyclerView.LayoutParams
            val top = child.bottom + params.bottomMargin +
                    Math.round(ViewCompat.getTranslationY(child))
            val bottom = top + mDivider!!.intrinsicHeight
            mDivider!!.setBounds(left, top, right, bottom)
            mDivider!!.draw(c)
        }
    }

    fun drawHorizontal(c: Canvas, parent: RecyclerView){
        val top = parent.paddingTop
        val bottom = parent.height - parent.paddingBottom
        val childCount = parent.childCount
        for (i in 0 until childCount) {
            val child = parent.getChildAt(i)
            val params = child
                    .layoutParams as RecyclerView.LayoutParams
            val left = child.right + params.rightMargin +
                    Math.round(ViewCompat.getTranslationX(child))
            val right = left + mDivider!!.intrinsicHeight
            mDivider!!.setBounds(left, top, right, bottom)
            mDivider!!.draw(c)
        }
    }

    companion object {
        private val ATTRS = intArrayOf(android.R.attr.listDivider)
    }
}

main_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.cmh.recyclerdmeo.MainActivity">

    <TextView
        android:id="@+id/rv_add_item"
        android:layout_width="match_parent"
        android:layout_height="80dp"
        android:gravity="center"
        android:clickable="true"
        android:text="添加條目"
        android:textSize="18dp"
        android:background="#6a167fe9"/>

    <TextView
        android:id="@+id/rv_delete_item"
        android:layout_width="match_parent"
        android:layout_height="80dp"
        android:gravity="center"
        android:clickable="true"
        android:text="刪除條目"
        android:textSize="18dp"
        android:background="#f092f9"/>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/my_recycler_view"
        android:scrollbars="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </android.support.v7.widget.RecyclerView>

</LinearLayout>

view_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="100dp">
    
    <TextView
        android:id="@+id/tv_item"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="item"
        android:textSize="20dp"/>

</LinearLayout>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市酪术,隨后出現(xiàn)的幾起案子器瘪,更是在濱河造成了極大的恐慌,老刑警劉巖绘雁,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件橡疼,死亡現(xiàn)場離奇詭異,居然都是意外死亡庐舟,警方通過查閱死者的電腦和手機欣除,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挪略,“玉大人历帚,你說我怎么就攤上這事「苡椋” “怎么了挽牢?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長摊求。 經(jīng)常有香客問我禽拔,道長,這世上最難降的妖魔是什么室叉? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任睹栖,我火速辦了婚禮,結(jié)果婚禮上茧痕,老公的妹妹穿的比我還像新娘野来。我一直安慰自己,他們只是感情好踪旷,可當(dāng)我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布曼氛。 她就那樣靜靜地躺著豁辉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪搪锣。 梳的紋絲不亂的頭發(fā)上秋忙,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機與錄音构舟,去河邊找鬼灰追。 笑死,一個胖子當(dāng)著我的面吹牛狗超,可吹牛的內(nèi)容都是我干的弹澎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼努咐,長吁一口氣:“原來是場噩夢啊……” “哼苦蒿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起渗稍,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤佩迟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后竿屹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體报强,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年拱燃,在試婚紗的時候發(fā)現(xiàn)自己被綠了秉溉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡碗誉,死狀恐怖召嘶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情哮缺,我是刑警寧澤弄跌,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站尝苇,受9級特大地震影響铛只,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜茎匠,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望押袍。 院中可真熱鬧诵冒,春花似錦、人聲如沸谊惭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至豹芯,卻和暖如春悄雅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背铁蹈。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工宽闲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人握牧。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓容诬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親沿腰。 傳聞我的和親對象是個殘疾皇子览徒,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容