iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 23
0

更新 RecyclerView 畫面

最近在寫一個練習一個 sideproject 實遇到需要當使用者更新資料時,要同時更新資料至 RecyclerView 上的情況。作法有許多種,透過幾個大神的題點,第一次使用了 interface 來做操作。趁著記憶猶新趕快記下來。

如何實現?

我們希望當使用者加入新資料到 ArrayList 的時候,我們可以將這個 ArrayList 取代 Adapter 中舊有的 ArrayList 換掉,並提醒 Adapter 有資料更新。

有了以上想法後,我們更進一步的思考,如果我們有許多畫面需要更新那該如何實作呢?

我們這裡的作法是,我們透過建立 interface 裡面有一個更新畫面的 function。

再將所有需要更新畫面的 adapter 都繼承該 interface ,並 override 其 function 。

然後將所有有繼承該 interface 的類別用一個 list 儲存起來。方便統一導入新 list 。

實作

首先我們先建立一個 interface 它裡面定義一個 function 需要傳入新的 ArrayList

interface UpdateData {

    fun dataChange(newDataList: ArrayList<NameData>) {

    }
}

然後我們在 Adapter 裡繼承這個 interface 並且將新的 ArrayList 取代舊的。

class NameAdapter(var nameList: ArrayList<NameData>):RecyclerView.Adapter<NameAdapter.ViewHolder>(),UpdateData {
                    .
                    .
                    .
                    .
                    .
override fun dataChange(newDataList: ArrayList<NameData>) {
        this.nameList = newDataList
        notifyDataSetChanged()
    }
    
}

接著,我們在 MainActivity 裡把這個 Adapter 加入一個存放所有有繼承該 interface 的 ArrayList 裡(但這個例子裡只有一個)。
這個動作我們,寫了一個 register function 來實現。

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

        adapter = NameAdapter(DataService.nameList)
        recyclerView.adapter = adapter
        //加入 ArrayList
        DataService.register(adapter)
    }

看到這裡也許會感到困惑,這個 register 是怎麼來的。
就讓我們來看看 DataService 裡裝的是什麼吧。

這個 DataService 是一個 object 物件,能夠保持結構的單一性。
裡面我們就可以看到,當使用者呼叫 addName 這個 function 的同時。
我們把使用者新輸入的資料加入後,也一並將 List 更新給所有有繼承這個 interface 的 adapter 。

object DataService {

    var interList = arrayListOf<UpdateData>()

    fun register(input: UpdateData) {
        interList.add(input)
    }


    var nameList = arrayListOf<NameData>()

    fun addName(name: String): MutableList<NameData>{

        nameList.add(NameData("$name"))

        for ( i in 0 until interList.size) {
            interList[i].dataChange(nameList)
        }

        return nameList


    }
}

這樣的作法能夠方便的管理多個畫面的更新。讓程式的可用性更高。

今天就先這樣囉,我們明天見。


上一篇
Day22_Notification
下一篇
Day24_MediaPlayer_1
系列文
發現新大陸-Android Kotlin 開發之路30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言