写这篇文章是为了方便直接使用RecycleView。
其中并未叙述原理。
使用RecycleView一共只有三步
步骤1.创建View,如:在main_activity.xml里添加recycleview的View
步骤2.创建Adapter,如:创建继承RecyclerView.Adapter的Adapter
步骤3.给View挂上Adapter,如:在MainActivity里设置view.adapter = myAdapter
实现后的动态效果如下:
1 XML布局里面加上RecyclerView,起个名字(id)
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/mRecycleView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical" />
2 在Acticity里给RecycleView设置Adapter
//初始化RecycleView
private fun initRecycleView() {
log("initRecycleView")
elfHomeAdapter = ElfHomeAdapter()
mRecycleView.layoutManager = LinearLayoutManager(this)
mRecycleView.adapter = elfHomeAdapter
}
3 创建继承了RecyclerView.Adapter的Adapter
class ElfHomeAdapter() :
RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private var mList: ArrayList<ElfData> = ArrayList() //存储Item数据
class ElfData(_length: Int, _desc: Int) { //自定义的Item数据结构
var length: String = _length.toString()
var desc: String = _desc.toString()
}
companion object { //标记View的位置
const val IS_BOTTOM = 1
const val IS_NOT_BOTTOM = 0
}
// //刷新Data,当Activity,onResume时手动调用。(场景:如果你在其他界面改变了数据,回到本场景得手动刷新一下)
// fun freshData() {
// val list: ArrayList<ElfData> = ArrayList()
// val dataSize = sqliteDataManager.getSize()
// for (i in 1..dataSize) list.add(ElfData(sqliteDataManager.getMovSize(i), i))
// mList = list
// }
//获取想展示的Item的数量
override fun getItemCount(): Int {
log("getItemCount " + mList.size)
return mList.size + 1 //+1是为了显示底部的按钮
}
//获取Item的ViewType,给onCreateViewHolder用的。
override fun getItemViewType(position: Int): Int {
log("getItemViewType")
return if (position == mList.size) IS_BOTTOM else IS_NOT_BOTTOM
}
//自定义Item的Holder
internal inner class ItemHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
var length: TextView = itemView.findViewById(R.id.length)
var desc: TextView = itemView.findViewById(R.id.desc)
var enterBtn: Button = itemView.findViewById(R.id.enter)
}
//自定义底部按钮的Holder
internal inner class ButtonHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
var addBtn: Button = itemView.findViewById(R.id.newelf)
var killBtn: Button = itemView.findViewById(R.id.killelf)
}
//自定义空白的Holder,不出问题的话,调用不到。
internal inner class NullHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
private fun log(str: String) {
Log.d("ElfHomeAdapter", str)
}
//当RecyclerView需要RecyclerView.ViewHolder展示Item时调用。
//(parent就是xml里面的自建的recycleView,viewType用来辅助你生成不同的View)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
log(parent.accessibilityClassName.toString())
log("onCreateViewHolder")
when (viewType) {
0 -> return ItemHolder(
LayoutInflater.from(parent.context).inflate(
R.layout.item_alf,
parent,
false
)
)
1 -> return ButtonHolder(
LayoutInflater.from(parent.context).inflate(
R.layout.item_elfmag,
parent,
false
)
)
}
return NullHolder(
LayoutInflater.from(parent.context).inflate(R.layout.item_elfmag, parent, false)
)
}
//当RecyclerView想展示特定位置的Item时会调用. 可以更新特定Item数据。
//(holder是自建的holder,position是这个Item的位置)
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
log("onBindViewHolder")
when (getItemViewType(position)) {
IS_NOT_BOTTOM -> {
val itemHolder =
holder as ItemHolder
itemHolder.length.text = mList[position].length
itemHolder.desc.text = mList[position].desc
itemHolder.enterBtn.setOnClickListener {
//自定义事件
}
}
IS_BOTTOM -> {
val buttonHolder = holder as ButtonHolder
buttonHolder.addBtn.setOnClickListener {
val movId = mList.size + 1
mList.add(ElfData(0, movId))
notifyDataSetChanged()
}
if (position > 0) {
buttonHolder.killBtn.setOnClickListener {
val movSize = mList.size
mList.removeAt(movSize - 1)
notifyDataSetChanged()
}
buttonHolder.killBtn.visibility = View.VISIBLE
} else {
buttonHolder.killBtn.visibility = View.INVISIBLE
}
}
}
}
}