RecycleView 的功能為將一筆大陣列資料,顯示出來,不需要知道資料中的數量。
藉由 RecyclerView,您可以輕鬆有效地顯示大型資料集。由您提供資料並定義每個項目的外觀,而 RecyclerView 程式庫則會在需要時動態建立元素。
顧名思義,RecyclerView 就是回收個別元素。當向下捲動螢幕而未顯示項目時,RecyclerView 並不會刪除其檢視畫面。只不過,RecyclerView 會重複使用捲動螢幕後顯示新項目的檢視畫面。RecyclerView 可改善效能和應用程式的回應速度,並降低耗電量。
以上為 Android 官方文件說明!:)
RecycleView 配置:
- 創建 Adapter
onCreateViewHolder(): 建立新的 ViewHolder
時,RecyclerView
都會呼叫這個方法。這個方法會建立及初始化 ViewHolder
及其相關聯的 View
。
onBindViewHolder(): RecyclerView
會呼叫此方法,將 ViewHolder
與資料建立關聯,並將資料填入檢視容器的版面配置。
getItemCount():RecyclerView
會呼叫此方法,取得資料集的大小。
建立 Adapter 類別時會繼 RecyclerView.Adapter<RecyclerView.ViewHolder>(),一定要覆寫上面三個函式。
class MainListAdapter(context: Context, var itemList: List<CityResponse>): RecyclerView.Adapter<RecyclerView.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val view: View = LayoutInflater.from(parent.context).inflate(R.layout.adapter_info, parent, false)
return InfoViewHolder(view)
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when (holder) {
is InfoViewHolder -> holder.bind(itemList[position].city, itemList[position].name,
itemList[position].address, itemList[position].url, itemList[position].open_time)
}
}
override fun getItemCount(): Int {
return if (itemList == null) 0 else itemList.size
}
private inner class InfoViewHolder(itemView: View): RecyclerView.ViewHolder(itemView){
var infoCity: TextView = itemView.findViewById(R.id.txt_city)
var infoName: TextView = itemView.findViewById(R.id.txt_name)
var infoAdress: TextView = itemView.findViewById(R.id.txt_address)
var infoUrl: TextView = itemView.findViewById(R.id.txt_url)
var infoOpenTime: TextView = itemView.findViewById(R.id.txt_open_time)
fun bind(city: String, name: String, adress: String, url: String, opentime: String) {
infoCity.text = city
infoName.text = name
infoAdress.text = adress
infoUrl.text = url
infoOpenTime.text = opentime
}
}
}
2. 創建物件樣式 xml
3. 在 Activity 中,將 RecycleView 與 LayoutManager 與 Adpter 連接。
private fun initRecycleView(data: List<CityResponse>) {
binding.viewInfo.layoutManager = LinearLayoutManager(this)
binding.viewInfo.adapter = MainListAdapter(this, data)
}
4. 結果
Reference: