首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >onBindViewHolder不能正确接收payload?

onBindViewHolder不能正确接收payload?

提问于 2023-02-04 16:28:24
回答 0关注 0查看 51
代码语言:javascript
复制
class CqlbAdapter(_data: List<Cq_item>): RecyclerView.Adapter<RecyclerView.ViewHolder>() {
    private val data = mutableListOf<Any>()

    init {
        data.addAll(_data)
    }



    override fun getItemCount() = data.size

    override fun getItemViewType(position: Int): Int {
        return when (data[position]) {
            is Cq_item -> 0
            is List<*> -> 1
            else -> throw Exception()
        }
    }

    @SuppressLint("NotifyDataSetChanged")
    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        if(holder is ItemViewHolder){
            if (data[position] is Cq_item){
                val d = data[position] as Cq_item
                holder.setJob(d.job)
                holder.setProject(d.project)
                holder.setGR(d.gr)
                holder.itemView.findViewById<ImageButton>(R.id.ib_more).setOnClickListener {
                    data.add(position+1,d.list)
                    notifyItemInserted(position+1)
                    //notifyItemChanged(position+1,"list_name")
                    notifyItemRangeChanged(position+1,data.size - (position + 1),"list_name")
                }
            }
        }
    }

    override fun onBindViewHolder(
        holder: RecyclerView.ViewHolder,
        position: Int,
        payloads: MutableList<Any>
    ) {
        if (payloads.isEmpty())
            onBindViewHolder(holder,position)
        else
            if (holder is NamesViewHolder){
                if (data[position] is List<*>){
                    val d = data[position] as List<String>
                    holder.setNames(d)
                }
            }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        return when(viewType){
            0 -> ItemViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.rvlist_cqlb_item, parent, false))
            1 -> NamesViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.rvlist_cqlb_names, parent, false))
            else -> throw Exception()
        }
    }

    class ItemViewHolder(item: View): RecyclerView.ViewHolder(item){
        fun setProject(name: String){
            itemView.findViewById<TextView>(R.id.tv_project_name).text = name
        }
        fun setJob(name: String){
            itemView.findViewById<TextView>(R.id.tv_job).text = name
        }
        fun setGR(name: Float){
            itemView.findViewById<TextView>(R.id.tv_gr).text = "$name 天"
        }
    }

    class NamesViewHolder(item: View): RecyclerView.ViewHolder(item){
        fun setNames(list: List<String>){
            itemView.findViewById<GridView>(R.id.gv_names).apply {
                adapter = ArrayAdapter(itemView.context,android.R.layout.simple_list_item_1,list)
                numColumns = 4
            }
        }
    }

    data class Cq_item(
        var project: String,
        var job: String,
        var gr: Float,
        val list: List<String>
    )
}

val list = mutableListOf<CqlbAdapter.Cq_item>()
list.add(0, CqlbAdapter.Cq_item("888","999",6.5f,listOf("11","222","333")))
adapter = CqlbAdapter(list)
layoutManager = LinearLayoutManager(this@Xjcq,RecyclerView.VERTICAL,false)

debug显示,在第一次点击时payload传了Null值,要第二次点击才能正确传值,这是什么原因

回答

和开发者交流更多问题细节吧,去 写回答
相关文章

相似问题

相关问答用户
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档