# Recycler View 基礎用法- kotlin 1. OnePieceAdapter.kt * Adtapter類別定義參數onePieceList他的資料型態是List,而List<>裡面的OnePiece是我們定義的data class, * 繼承RecyclerView.Adapter, 而<>裡面OnePieceAdapter.ViewHolder是我們要額外再定義的一個class ```kotlin= @Suppress("UNREACHABLE_CODE") class OnePieceAdapter(val onePieceList: List<OnePiece>) : RecyclerView.Adapter<OnePieceAdapter.ViewHolder>(){ init { Log.d("類別初始化", "init執行了") } inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view){ //viewHolder定義要顯示在recyclerView的layout元件 val fruitImage = view.findViewById<ImageView>(R.id.fruitImage) val fruitName = view.findViewById<TextView>(R.id.fruitName) //定義真正綁定的工作 fun bindData(data: OnePiece){ fruitImage.setImageResource(data.imageId) fruitName.text = data.name } } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { //把要顯示在recyclerView的view inflate出來, fruit_item是要綁進Adapter的xml. Log.d("onCreateViewHolder", "onCreateViewHolder準備執行") val view = LayoutInflater.from(parent.context).inflate(R.layout.fruit_item, parent, false) Log.d("return", "onCreateViewHolder生成view") return ViewHolder(view) } override fun getItemCount(): Int { Log.d("getItemCount", "取得要綁給Adapter的資料大小") return onePieceList.size } override fun onBindViewHolder(holder: ViewHolder, position: Int) { Log.d("顯示資料", "Bind資料到recycler View") val fruit = onePieceList[position] //將要綁定的位置與data 透過ViewHolder的涵式進行操作 holder.bindData(fruit) } } ``` 2. OnePiece.kt * 這邊定義data class :OnePiece ,要傳給Adapter的資料型態 ```kotlin= data class OnePiece(val name: String, val imageId: Int) ``` 3. MainActivity.kt * ```kotlin= class MainActivity : AppCompatActivity() { //定義要綁定給Adapter的資料 private val fruitList = ArrayList<OnePiece>() lateinit var recyclerView : RecyclerView override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) recyclerView = findViewById(R.id.recyclerView) //要綁定給Adapter的數據先初始化塞進List initFruits() //布局Layout Manager :瀑布流 // val layoutManager = StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL) // recyclerView.layoutManager = layoutManager //線性流 val linearLayoutManager = LinearLayoutManager(this) recyclerView.layoutManager = linearLayoutManager //自訂分隔線(自定義圖片) //var divider = DividerItemDecoration(this, DividerItemDecoration.VERTICAL) // ContextCompat.getDrawable(this, R.drawable.ic_launcher_foreground)?.let { divider.setDrawable(it) } //recyclerView.addItemDecoration(divider) //使用內建的分隔線↓ recyclerView.addItemDecoration(DividerItemDecoration(this@MainActivity,LinearLayoutManager.VERTICAL)) //綁定Adapter val adapter = OnePieceAdapter(fruitList) recyclerView.adapter = adapter } //自定義要給Adapter的資料 private fun initFruits() { repeat(2) { fruitList.add(OnePiece("魯夫", R.drawable.luffy)) fruitList.add(OnePiece("布魯克",R.drawable.brook)) fruitList.add(OnePiece("喬巴", R.drawable.chopper)) fruitList.add(OnePiece("佛朗基",R.drawable.frank)) fruitList.add(OnePiece("基拉",R.drawable.killer)) fruitList.add(OnePiece("娜美", R.drawable.nami)) fruitList.add(OnePiece("羅賓", R.drawable.robin)) fruitList.add(OnePiece("香吉", R.drawable.sanji)) fruitList.add(OnePiece("烏索普", R.drawable.sogeking)) fruitList.add(OnePiece("德瑞克", R.drawable.xdrike)) fruitList.add(OnePiece("拖拉法爾加-羅", R.drawable.trafalg)) fruitList.add(OnePiece("儸儸諾亞-索隆", R.drawable.zoro)) } } } ``` [recyclerview的機制](https://www.jianshu.com/p/21a1384df9a1) ###### tags: `recycler view` `kotlin` `Android`