一、引入和使用控件
1. 引入
RecyclerView属于新增控件,定义在AndroidX中,需要在app/build.gradle文件中dependencies闭包中引入:
dependencies {
implementation 'androidx.recyclerview:recyclerview:1.1.0'
}
2. 使用
在布局文件.xml中使用:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/messageRecyclerView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
/>
</LinearLayout>
二、布局方式
1. LinearLayoutManager 线性布局
竖向滚动
val layoutManager = LinearLayoutManager(this)
messageRecyclerView.layoutManager = layoutManager
adapter = MsgAdapter(msgList)
messageRecyclerView.adapter = adapter
横向滚动
val layoutManager = LinearLayoutManager(this)
layoutManager.orientation = LinearLayoutManager.HORIZONTAL
messageRecyclerView.layoutManager = layoutManager
adapter = MsgAdapter(msgList)
messageRecyclerView.adapter = adapter
2. GridLayoutManager 网格布局
val layoutManager = GridLayoutManager(this, 6)
messageRecyclerView.layoutManager = layoutManager
adapter = MsgAdapter(msgList)
messageRecyclerView.adapter = adapter
3. StaggeredGridLayoutManager 瀑布布局
val layoutManager = StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL)
messageRecyclerView.layoutManager = layoutManager
adapter = MsgAdapter(msgList)
messageRecyclerView.adapter = adapter
三、适配器
class MsgAdapter(val msgList: List<Msg>): RecyclerView.Adapter<RecyclerView.ViewHolder>() {
inner class LeftViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val leftMsg: TextView = view.findViewById(R.id.leftMsg) // 加载控件
}
inner class RightViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val rightMsg: TextView = view.findViewById(R.id.rightMsg) // 加载控件
}
override fun getItemViewType(position: Int): Int {
// 返回当前子项对应的布局类型
val msg = msgList[position]
return msg.type
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
if (viewType == Msg.TYPE_RECEIVED) { //加载布局,创建Holder实例后加载控件
val view =
LayoutInflater.from(parent.context).inflate(R.layout.msg_left_item, parent, false)
// 加载完控件后可在此完成点击事件等
return LeftViewHolder(view)
} else {
val view =
LayoutInflater.from(parent.context).inflate(R.layout.msg_right_item, parent, false)
return RightViewHolder(view)
}
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
// 在此处给Holder里的控件绑定值
val msg = msgList[position]
when (holder) {
is LeftViewHolder -> holder.leftMsg.text = msg.content
is RightViewHolder -> holder.rightMsg.text = msg.content
else -> throw IllegalArgumentException()
}
}
// 获取子项总数
override fun getItemCount(): Int = msgList.size
}
四、RecyclerView的点击事件
在onCreatViewHolder()中创建
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.fruit_item, parent, false)
val viewHolder = ViewHolder(view)
viewHolder.itemView.setOnClickListener{
val position = viewHolder.adapterPosition
val fruit = fruitList[position]
Toast.makeText(parent.context, "click view ${fruit.name}", Toast.LENGTH_SHORT).show()
}
viewHolder.fruitImage.setOnClickListener{
val position = viewHolder.adapterPosition
val fruit = fruitList[position]
Toast.makeText(parent.context, "click view ${fruit.imageId}", Toast.LENGTH_SHORT).show()
}
return viewHolder
}
|