美文网首页
Android RecycleView多类型item

Android RecycleView多类型item

作者: 折剑游侠 | 来源:发表于2020-01-15 10:05 被阅读0次

记录一下多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()
                        }
                    }
                }
            }
        })
    }

相关文章

网友评论

      本文标题:Android RecycleView多类型item

      本文链接:https://www.haomeiwen.com/subject/opazactx.html