目錄
- 概述
- 優點
- 列表布局RecyclerView
- 一、創建RecyclerView并且在布局中綁定
- 二、實現RecyclerView單個item的布局
- 三、給RecyclerView寫一個對應的適配器Adapter
- 1.創建自定義的ViewHolder
- 2.繼承Adapter,泛型使用我們自定義的ViewHolder
- 3.重寫Adapter的三個方法
- onCreateViewHolder
- getItemCount
- onBindViewHolder
- 四、RecyclerView綁定布局和適配器
- 五、RecyclerView單個item點擊事件
- 1.創建監聽接口
- 2.Activity中實現接口并且傳給Adapter
- 3.綁定事件中監聽
- 4.當點擊時,執行的是Activity中實現的方法
概述
RecyclerView 是 Android 開發中一個非常強大且靈活的組件,用于在有限的窗口中展示大量數據集。它提供了一種比傳統的 ListView 更高效的方式來滾動大量數據項。RecyclerView 不僅可以像 ListView 那樣垂直滾動,還可以水平滾動,甚至支持更復雜的布局,如網格布局(Grid Layout)、瀑布流布局(Staggered Grid Layout)。
優點
- ViewHolder對視圖復用;
- 可以垂直滾動和水平滾動;
- 支持多種布局;
列表布局RecyclerView
今天實現一個簡單的RecyclerView,效果如下圖所示:
一、創建RecyclerView并且在布局中綁定
<androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/rlv_1"android:layout_width="match_parent"android:layout_height="match_parent" />
rlv1 = findViewById(R.id.rlv_1)
二、實現RecyclerView單個item的布局
```kotlin
<LinearLayout 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="wrap_content"android:background="#cccccc"android:paddingTop="10dp"android:paddingBottom="10dp"android:paddingRight="20dp"android:paddingLeft="20dp"><ImageViewandroid:id="@+id/iv_icon"android:layout_width="50dp"android:layout_height="50dp"android:layout_marginRight="20dp"android:src="@drawable/fangyuan" /><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="match_parent"android:layout_weight="1"android:orientation="vertical"><TextViewandroid:id="@+id/tv_name"android:layout_width="wrap_content"android:layout_height="0dp"android:layout_weight="1"android:text="小白"android:textColor="@color/black"android:textSize="16sp" /><TextViewandroid:id="@+id/tv_content"android:layout_weight="1"android:layout_width="wrap_content"android:layout_height="0dp"android:textSize="14sp"android:textColor="#666666"android:text="今天上班有摸魚嗎?"/></LinearLayout><TextViewandroid:id="@+id/tv_time"android:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="end"android:layout_marginTop="20dp"android:textColor="#999999"android:textSize="14sp"android:text="2024年7月9日"/></LinearLayout>
三、給RecyclerView寫一個對應的適配器Adapter
1.創建自定義的ViewHolder
class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {var ivIcon: ImageView? = nullvar tvName: TextView? = nullvar tvContent: TextView? = nullvar tvTime: TextView? = nullinit {ivIcon = itemView.findViewById(R.id.iv_icon)tvName = itemView.findViewById(R.id.tv_name)tvContent = itemView.findViewById(R.id.tv_content)tvTime = itemView.findViewById(R.id.tv_time)}}
2.繼承Adapter,泛型使用我們自定義的ViewHolder
class MyAdapter(
): RecyclerView.Adapter<MyViewHolder>() {
}
3.重寫Adapter的三個方法
onCreateViewHolder
顧名思義,創建我們自定義ViewHolder的實例,也就是將item的布局作為itemView。ViewHolder是列表中每個item。
inflate,三個參數,
第一個為加載的布局id;第二個為該布局的外部是否嵌套一層父布局,不用就是null;第三個,是否給加載的布局添加一個root的外層容器。
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {val view = LayoutInflater.from(context).inflate(R.layout.item_list, parent, false)val myViewHolder = MyViewHolder(view)return myViewHolder}
getItemCount
item的條數
override fun getItemCount(): Int {return nameList.size}
onBindViewHolder
通過onCreateViewHolder()綁定了布局之后,接下來對數據和布局里面的控件進行綁定。
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {holder.tvName?.text = nameList[position]holder.tvContent?.text = contentList[position]holder.tvTime?.text = timeList[position]}
四、RecyclerView綁定布局和適配器
private fun initData() {val nameList = ArrayList<String>()val contentList = ArrayList<String>()val timeList = ArrayList<String>()for (i in 0..19) {nameList.add("方正")contentList.add("送外賣第${i}天")timeList.add("${1}月${i + 1}日")}val adapter = MyAdapter(this,nameList,contentList,timeList)val manager = LinearLayoutManager(this)rlv1?.layoutManager = managerrlv1?.adapter = adapter}
至此,已經實現了開頭的列表效果。
五、RecyclerView單個item點擊事件
1.創建監聽接口
interface OnItemClickListener {fun onItemClick(position: Int)
}
2.Activity中實現接口并且傳給Adapter
3.綁定事件中監聽
holder.itemView.setOnClickListener{listener.onItemClick(position)}