记录一下多item布局、上拉加载、空数据页面实现。
重写Adapter.getItemViewType()方法,返回对应的itemType。
class DataAdapter(private val data: ArrayList<Data>) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private var listener: ((Int) -> Unit)? = null
companion object {
const val TYPE_NORMAL = 1
const val TYPE_MORE = 2
const val TYPE_EMPTY = 3
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val view: View
when (viewType) {
TYPE_NORMAL -> {
view = LayoutInflater.from(parent.context).inflate(R.layout.item_data, parent, false)
return ViewHolderNormal(view)
}
TYPE_MORE -> {
view = LayoutInflater.from(parent.context).inflate(R.layout.item_data_more, parent, false)
return ViewHolderMore(view)
}
TYPE_EMPTY -> {
view = LayoutInflater.from(parent.context).inflate(
R.layout.item_data_empty,
parent,
false
)
return ViewHolderEmpty(view)
}
else -> {
view = LayoutInflater.from(parent.context).inflate(R.layout.item_data_more, parent, false)
return ViewHolderMore(view)
}
}
}
//size+1 加载更多footer
override fun getItemCount(): Int {
return data.size + 1
}
override fun onBindViewHolder(viewHolder: RecyclerView.ViewHolder, position: Int) {
val viewType = getItemViewType(position)
when (viewType) {
TYPE_NORMAL -> {
val holder = viewHolder as ViewHolderNormal
}
TYPE_MORE -> {
val holder = viewHolder as ViewHolderMore
}
TYPE_EMPTY -> {
val holder = viewHolder as ViewHolderEmpty
}
else -> {
val holder = viewHolder as ViewHolderMore
}
}
}
//data size为0时返回空布局,列表最后一项返回加载更多布局。
override fun getItemViewType(position: Int): Int {
if (data.size == 0) return TYPE_EMPTY
return if (position == data.size) TYPE_MORE
else TYPE_NORMAL
}
fun setOnItemClickListener(listener: ((Int) -> Unit)) {
this.listener = listener
}
class ViewHolderNormal(item: View) : RecyclerView.ViewHolder(item)
class ViewHolderEmpty(item: View) : RecyclerView.ViewHolder(item)
class ViewHolderMore(item: View) : RecyclerView.ViewHolder(item)
}
使用处
private fun initAdapter() {
adapter = DataAdapter(data)
val manager = LinearLayoutManager(this)
rv.layoutManager = manager
rv.adapter = adapter
//item点击事件
adapter.setOnItemClickListener {
}
//上拉加载更多
rv.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
lastVisibleItemPosition = manager.findLastVisibleItemPosition()
}
override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
super.onScrollStateChanged(recyclerView, newState)
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
if (lastVisibleItemPosition + 1 == adapter.itemCount) {
if (lastPage == "N") {//是否有下一页,接口约定返回。
getMoreData()
}
}
}
}
})
}
网友评论