# 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`