這裡記錄一下如何使用Kotlin語言來製作RecycleView的功能。
list_test.xml (清單的View)
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="60dp"> <TextView android:id="@+id/textView8" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="TextView" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
與Java一樣架構。
DeviceUserManagerAdapter.kt (RecycleView的Adapter)
class DeviceUserManagerAdapter(private val context: Context, private val data: IntArray, private val itemClickListener: OnItemClickListener): RecyclerView.Adapter<DeviceUserManagerAdapter.ViewHolder>() { //建立點擊事件傳遞介面 interface OnItemClickListener { fun onItemClick(position: Int) fun onItemLongClick(position: Int) } inner class ViewHolder(itemView:View):RecyclerView.ViewHolder(itemView){ //把layout檔的元件們拉進來,指派給當地變數 val textView8: TextView = itemView.findViewById(R.id.textView8) init { textView8.setOnClickListener { Toast.makeText(context, "點擊了$adapterPosition",Toast.LENGTH_SHORT).show() val position = getBindingAdapterPosition()//adapterPosition if (position != RecyclerView.NO_POSITION) { //傳遞點擊事件 itemClickListener.onItemClick(position) } } textView8.setOnLongClickListener { val position = getBindingAdapterPosition() //處理長按事件 if (position != RecyclerView.NO_POSITION) { itemClickListener.onItemLongClick(position) } true } } } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DeviceUserManagerAdapter.ViewHolder { //載入畫面 val inflater = LayoutInflater.from(parent.context) val view = inflater.inflate(R.layout.list_test, parent, false) return ViewHolder(view) } override fun onBindViewHolder(holder: DeviceUserManagerAdapter.ViewHolder, position: Int) { holder.textView8.text = data[position].toString() } override fun getItemCount(): Int { return data.size } }
與Java有些不一樣,綁定View元件的地方使用inner
,並且在init
中監聽元件的動作。
在Adapter建立時,順便將初始的清單與必要資訊傳入,同時建立點擊接收介面interface
,方便清單的控制
主程式部分
private lateinit var srlLayout: RefreshLayout private lateinit var rvList: RecyclerView private lateinit var mDeviceUserManagerAdapter: DeviceUserManagerAdapter override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_device_user_manager) initView() //這邊有使用SmartRefreshLayout套件來實現下拉重整的功能(不一定要) srlLayout.setRefreshHeader(MaterialHeader(this)) srlLayout.setOnRefreshListener { refreshlayout -> refreshlayout.finishRefresh(1000 /*,false*/) //傳入false表示刷新失敗 } //作為預設的清單資訊 var data = intArrayOf(68, 90, 76, 88, 92) //將Adapter new出來並初始化 mDeviceUserManagerAdapter = DeviceUserManagerAdapter(this, data, itemClickListener = object: DeviceUserManagerAdapter.OnItemClickListener{ override fun onItemClick(position: Int) { //清單案一下的事件 } override fun onItemLongClick(position: Int) { //清單長按的事件 } }) //與JAVA一樣,決定清單樣式與方向(這邊預設) rvList.layoutManager = LinearLayoutManager(this) //將Adapter套用至RecyclerView rvList.adapter = mDeviceUserManagerAdapter } private fun initView(){ srlLayout = findViewById(R.id.srl_device_user_manager_layout) rvList = findViewById(R.id.rv_device_user_manager_list) }
*更新
使用binding方式綁定Adapter元件的方式
inner class ViewHolder(bindingList: ListProjectBinding): RecyclerView.ViewHolder(bindingList.root) { //綁定元件 var binding: ListProjectBinding = bindingList init { binding.clListProjectRoot.setOnClickListener {//傳送點擊事件 val position = getBindingAdapterPosition()//adapterPosition if (position != RecyclerView.NO_POSITION) { itemClickListener.onItemClick(position) } } binding.clListProjectRoot.setOnLongClickListener { val position = getBindingAdapterPosition() if (position != RecyclerView.NO_POSITION) { itemClickListener.onItemLongClick(position) } true } } } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val binding = ListProjectBinding.inflate(LayoutInflater.from(parent.context), parent, false) return ViewHolder(binding) } override fun onBindViewHolder(holder: ViewHolder, position: Int) { //元件的顯示處理 with(list[position]) { holder.binding.tvListProjectName.text = this.name } }
-END-