【Android】RecyclerView 單選功能實現

自從成為一個Android開發者到現在默默的也7 8年有了,某天開始突然想到要整理一下自己碎片化的一些資訊,自己的履歷、練習範例、蒐藏的文章等等之類的,才突然又想起....原來我還有個部落格.... 既然又翻出來了,那就陸陸續續開始整理吧。Go go!
RecyclerView是Android開發中常用的元件,新手階段通常就是把DataList中的資料資料顯示出來,偶而再加個點擊事件使用,今天就分享個簡單的單選功能。

RecyclerView+Adapter的使用部份這邊就不多做說明了
要完成單選功能有幾種方式可以實現
這邊就用最簡單的方式,來人!上代碼!

TestAdapter.kt
class TestAdapter(private val dataTypeList: Array) :
    RecyclerView.Adapter< TestAdapter. TestViewHolder >() {

    //選擇的位置
    var selectPosition = 0

    class TestViewHolder(v: View) : RecyclerView.ViewHolder(v) {
        val itemName: TextView = v.findViewById(R.id.item_name)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TestViewHolder {
        return TestViewHolder(
            LayoutInflater.from(parent.context).inflate(R.layout.item_test, parent, false)
        )
    }

    override fun onBindViewHolder(holder: TestViewHolder, position: Int) {
        holder.itemName.text = dataList[position]
        holder.itemName.isSelected = holder.layoutPosition == selectPosition
        holder.itemName.setOnClickListener {
            holder.itemView.isSelected = true
            //設置新的position
            selectPosition = position
            notifyDataSetChanged()
        }
    }

    override fun getItemCount(): Int {
        return dataList.size
    }
}
對!你看的沒有錯,就只是多一個selectPosition來記憶選中的item而已

onBIndViewHolder內的
holder.layoutPosition == selectPosition
主要就是在判斷當前的holder.itemView是否是被選擇的狀態
所以當一開始selectPosition我們的預設值就設定為0
自然代表資料中的第一筆預設是被select的狀態

當點擊事件觸發時
selectPosition就會被點擊的position替換
執行notifyDataSetChanged()後Adapter做更新
onBIndViewHolder內的
holder.layoutPosition == selectPosition 就會去做select的狀態判斷

效果的話  元件就可以搭配"selector"來做選擇的效果
例如:
selector_text_color.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:color="#FFFFFF" />
<item android:color="#808080" />
</selector>
如果元件selected的狀態為true的話,顏色設置為"#FFFFFF"
預設狀態顏色則為"#808080"


以上是最簡單的RecyclerView單選功能實現,如果還要考慮到效能的部份就要考慮到更多部分
綁定級局部更新等等之類的問題,哪天有想到的話再打上來補充吧。


題外話,眼尖的應該有看到....
Adapter內的語法是Kotlin....
對!沒錯!就是Kotlin!
Android近年的資訊量爆炸進化,開發app的選擇多了許多...
只能說學不完阿~~(不學又不行,畢竟還是靠這技能吃飯)
後續的文章就不會只限定Java的語法了
可能也會分享一些資訊相關的技術文章~



沒有留言:

張貼留言