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
相关产品推荐
相关产品推荐

