recyclerview顧名思義是一種可以重複利用的view,用於顯示清單列表,是個很基本、用途也很廣的元件,基本上幾乎每個app都會用到。
recyclerview的回收機制的原理如下,系統只會產生一定數量的view,當使用者往下捲動,螢幕上方被移動到畫面外的view就會被回收,把內容換成新的資料,並從螢幕下方塞回來,這機制的好處可以大幅提升app效能。
建立dataModel來定義資料格式,item_ex來做出每個項目的模板,然後接入adapter。可以把資料想像成客人,dataModel想像成餐廳設定的客群對象,Item_ex是座位,adapter是負責帶位的服務生,到時候負責把客人綁定到預定好的座位上。而mainActivity本身餐廳,在這裡傳入資料(接待客人)及連接adapter(雇用服務生)。
dependencies {
implementation "androidx.recyclerview:recyclerview:1.1.0"
// For control over item selection of both touch and mouse driven selection
implementation "androidx.recyclerview:recyclerview-selection:1.1.0-rc02"
}
data class Item(val name:String,
val img:Int)
val myItemList = arrayListOf<Item>()
//生成資料
for(i in 0..5){
myItemList.add(Item("Wang",R.drawable.your_img))
}
<ImageView
android:id="@+id/imgv"
android:layout_width="match_parent"
android:layout_height="0dp"
android:src="@drawable/xxxxxxx"
/>
<TextView
android:id="@+id/tv_name"
android:layout_width="0dp"
android:layout_height="30dp"
android:text="xxxxxxx" />
class MyAdapter:RecyclerView.Adapter<MyAdapter.mViewHolder>() {
var unAssignList = listOf<Item>()
inner class mViewHolder(itemView:View):RecyclerView.ViewHolder(itemView){
//把layout檔的元件們拉進來,指派給當地變數
val icon = itemView.imgv
val name = itemView.tv_name
fun bind(item: Item){
//綁定當地變數與dataModel中的每個值
icon.setImageResource(item.img)
name01.text = item.name
}
}
override fun onCreateViewHolder(parent:ViewGroup,viewType: Int):mViewHolder {
//載入項目模板
val inflater = LayoutInflater.from(parent.context)
val example = inflater.inflate(R.layout.item_example, parent, false)
return mViewHolder(example)
}
override fun getItemCount() = unAssignList.size
override fun onBindViewHolder(holder: mViewHolder, position: Int) {
//呼叫上面的bind方法來綁定資料
holder.bind(unAssignList[position])
}
//更新資料用
fun updateList(list:ArrayList<Movement>){
unAssignList = list
}
}
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/r_view"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</androidx.recyclerview.widget.RecyclerView>
class MainActivity : AppCompatActivity() {
val mAdapter = MyAdapter()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mAdapter.updateList(myItemList) //傳入資料
r_view.layoutManager = LinearLayoutManager(this)
r_view.adapter = mAdapter
}
完成啦,舒服。