天天看点

kotlin 给recycleview添加头部和尾部

1.创建adapter

class RecyclerViewAddHeaderAndFooterAdapter(var context: Context, var items: ArrayList):RecyclerView.Adapter<RecyclerViewAddHeaderAndFooterAdapter.ViewHolder>(){

companion object{

val TYPE_FOOTER = 1//添加Footer

val TYPE_HEADER = 2//添加Header

val TYPE_NORMAL = 0//两者都没有添加

var headerView: View? = null

var footerView: View? = null

}

var list = ArrayList()

init {

list = items

}

fun setHeaderView(hv: View){
        headerView = hv
        notifyItemInserted(0)
    }

    fun setFooterView(fv: View){
        footerView = fv
        notifyItemInserted(itemCount - 1)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        if (getItemViewType(position) == TYPE_HEADER) return
        else if (getItemViewType(position) == TYPE_FOOTER) return
        else{
            if (holder is RecyclerViewAddHeaderAndFooterAdapter.ViewHolder){
                Log.e("hjd", "position->"+ position)
                val positionTemp = if (headerView == null) position else position -1
                if (positionTemp < items.size){
                    holder.tv!!.text = items[positionTemp]
                    holder.itemView.tag= positionTemp
                }
            }
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        if (headerView != null && viewType == TYPE_HEADER)
            return ViewHolder(headerView!!)
        if (footerView != null && viewType == TYPE_FOOTER)
            return ViewHolder(footerView!!)

        val view = LayoutInflater.from(context).inflate(R.layout.item_recycler, parent, false)
        view.setOnClickListener { listener?.onItemClick(view, view.tag as Int) }
        return ViewHolder(view)
    }

    override fun getItemCount(): Int{
        if (headerView != null && footerView != null)
            return items.size + 2
        else if(headerView == null && footerView == null)
            return items.size
        else
            return items.size + 1
    }

    override fun getItemViewType(position: Int): Int {
        if (headerView == null && footerView == null)
            return TYPE_NORMAL
        if(position == 0)
            return TYPE_HEADER
        if(position == itemCount-1)
            return TYPE_FOOTER
        return TYPE_NORMAL
    }

    class ViewHolder(itemTv: View):RecyclerView.ViewHolder(itemTv){
        var tv: TextView? = null

        init {
            if (headerView != itemTv && footerView != itemTv) {
                tv = itemTv.findViewById(R.id.item_tv) as TextView
            }
        }

    }


    private var listener: OnItemClickListener?=null

    fun setOnItemClickListener(l: OnItemClickListener): Unit{
        this.listener = l
    }
    interface OnItemClickListener{
        fun onItemClick(view: View, pos: Int)
    }

    fun addItem(pos: Int){
        list.add(pos, "Add item"+ pos)
        notifyItemInserted(pos)
    }

    fun delItem(pos: Int){
        list.removeAt(pos)
        notifyItemRemoved(pos)
    }
}
2. 设置header和footer
/**
 * 添加HeaderView
 */
fun setHeaderView(rv: RecyclerView, adapter: RecyclerViewAddHeaderAndFooterAdapter){
    val hv = LayoutInflater.from(this).inflate(R.layout.item_header, rv, false)
    adapter.setHeaderView(hv)
}

/**
 * 添加FooterView
 */
fun setFooterView(rv: RecyclerView, adapter: RecyclerViewAddHeaderAndFooterAdapter){
    val hv = LayoutInflater.from(this).inflate(R.layout.item_footer, rv, false)
    adapter.setFooterView(hv)
}
3.activity调用
var arrayList = ArrayList<String>()
    arrayList.add("22222")
    arrayList.add("3334q2q")
    arrayList.add("34fssea")
    var recyclerAdapter = RecyclerViewAddHeaderAndFooterAdapter(context,arrayList)
    recyclerAdapter!!.setOnItemClickListener(object : RecyclerViewAddHeaderAndFooterAdapter.OnItemClickListener{
        override fun onItemClick(view: View, position: Int) {
            Toast.makeText(context," text is ${arrayList[position]}",Toast.LENGTH_SHORT).show()
        }
    })
    val itemDecoration = DividerItemDecoration(this, DividerItemDecoration.VERTICAL)
           

// itemDecoration.setDrawable(resources.getDrawable(R.drawable.divider_line))

activity_recyclerview.addItemDecoration(itemDecoration)

activity_recyclerview.itemAnimator=DefaultItemAnimator()

var linearLayoutManager = LinearLayoutManager(this)

linearLayoutManager.orientation=LinearLayoutManager.VERTICAL

activity_recyclerview.layoutManager = linearLayoutManager

activity_recyclerview.adapter = recyclerAdapter

setHeaderView(activity_recyclerview,recyclerAdapter)

setFooterView(activity_recyclerview,recyclerAdapter)