You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RecyclerView中Adapter不渲染元素且日志无报错问题求助

问题分析与解决

核心原因:未将Adapter关联到RecyclerView

你在点击按钮时创建了DomainAdapter实例,但没有把这个Adapter设置给RecyclerView,导致RecyclerView不知道要渲染哪个Adapter的数据——这是列表元素不显示的直接原因。

另外还有一个潜在问题:DomainViewHolder中的bind方法未被调用,会导致列表项的点击事件失效,虽然这不是当前不显示元素的原因,但也需要同步修复。

修改后的MainActivity代码

class MainActivity : AppCompatActivity(), DomainAdapter.OnClickListener {
    lateinit var adapter: DomainAdapter
    lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        binding.rvDomains.layoutManager = LinearLayoutManager(this)

        binding.btnSearch.setOnClickListener{
            adapter = DomainAdapter(this, mutableListOf(DomainCVE(binding.etSearch.text.toString())), true)
            // 关键步骤:将创建好的Adapter绑定到RecyclerView
            binding.rvDomains.adapter = adapter
            // 此处无需调用notifyDataSetChanged,新创建的Adapter已携带初始化数据
        }
    }

    override fun onClick(domain: DomainCVE) {
        val intent = Intent(this, DomainActivity::class.java)
        intent.putExtra("domain", domain)
        startActivity(intent)
    }
}

修改后的Adapter代码(修复点击事件)

class DomainAdapter(private val context: Context, private val domain: MutableList<DomainCVE>, private val load: Boolean): RecyclerView.Adapter<DomainAdapter.DomainViewHolder>() {

    class DomainViewHolder(item: View): RecyclerView.ViewHolder(item){
        val binding = DomainItemsBinding.bind(item)

        fun bind(domain: DomainCVE, listener: OnClickListener) = with(binding){
            tvDomainName.text = domain.address
            // 将视图显示逻辑移到bind方法中,统一管理
            if (load){
                ivDone.visibility = View.INVISIBLE
                ivLoad.visibility = View.VISIBLE
            }else{
                ivDone.visibility = View.VISIBLE
                ivLoad.visibility = View.INVISIBLE
            }
            itemView.setOnClickListener {
                listener.onClick(domain)
            }
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DomainViewHolder {
        val itemView = LayoutInflater.from(parent.context).inflate(R.layout.domain_items, parent, false)
        return DomainViewHolder(itemView)
    }

    override fun getItemCount(): Int {
        return domain.size
    }

    override fun onBindViewHolder(holder: DomainViewHolder, position: Int) {
        // 调用bind方法完成数据绑定与事件设置
        holder.bind(domain[position], this@DomainAdapter)
    }

    interface OnClickListener {
        fun onClick(domain: DomainCVE)
    }
}

额外说明

RecyclerView正常渲染的三个必要条件:设置LayoutManager、绑定Adapter、Adapter的getItemCount()返回大于0的数值。你之前仅完成了第一步,缺少关键的Adapter绑定步骤。

内容的提问来源于stack exchange,提问作者Ginger Killer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 03:01:05