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

继承AbsBottom抽象类后SearchActivity无法加载用户列表问题排查

问题:继承AbsBottom抽象类后SearchActivity无法识别userAdapter,搜索用户列表加载失败

我需要为SearchActivity实现数据库用户搜索功能,将通用功能抽取到继承自AppCompatActivity的AbsBottom抽象类中。仅修改继承关系后,原代码可正常运行,但新代码报错,提示无法识别userAdapter,导致搜索用户列表无法加载。

更新后的SearchActivity代码

class SearchActivity : AbsBottom(R.layout.activity_search, R.id.bottomNav, R.id.search_nav) {

    private var user = mutableListOf(UserSearch()) 
        private var userAdapter = UserViewHolder()
        lateinit var binding: ActivitySearchBinding

        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            binding = ActivitySearchBinding.inflate(layoutInflater)
            //setContentView(binding.root)
            //layout
            binding.recyclerProfile.setHasFixedSize(true)
            val llm = LinearLayoutManager(this)
            llm.orientation = LinearLayoutManager.VERTICAL
            binding.recyclerProfile.layoutManager = llm
            
            //region Adapter Setup
            binding.recyclerProfile.adapter = userAdapter
            binding.searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
                override fun onQueryTextSubmit(query: String?): Boolean {
            //do stuff
                }

                override fun onQueryTextChange(newText: String?): Boolean {
            //do other stuff
                }

            })
            //endregion
    }
}

原SearchActivity代码

class SearchActivity : AppCompatActivity() {

        private var user = mutableListOf(UserSearch())
        private var userAdapter = UserViewHolder()
        lateinit var binding: ActivitySearchBinding

        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            binding = ActivitySearchBinding.inflate(layoutInflater)
            setContentView(binding.root)

            bottomNavigation()
            //layout
            binding.recyclerProfile.setHasFixedSize(true)
            val llm = LinearLayoutManager(this)
            llm.orientation = LinearLayoutManager.VERTICAL

            binding.recyclerProfile.layoutManager = llm
            // userAdapter.setUsers(user)

            //region Adapter Setup
            binding.recyclerProfile.adapter = userAdapter
            binding.searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
                override fun onQueryTextSubmit(query: String?): Boolean {
            //do stuff
                }

                override fun onQueryTextChange(newText: String?): Boolean {
            //do other stuff
                }

            })
            //endregion
    }
}

AbsBottom抽象类代码

abstract class AbsBottom(val idC: Int, val idB: Int, val ac: Int) : AppCompatActivity() {
    protected lateinit var bottomNav : BottomNavigationView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(idC)
        bottomNav = findViewById(idB)
        bottomNav.selectedItemId = ac
    
    //etc
    }
}

问题分析与修复方案

核心问题1:变量缩进错误

更新后的代码中,userAdapter的定义缩进错误,被嵌套在user变量的作用域内(成为user的内部成员),导致onCreate方法无法访问到正确的userAdapter实例,从而触发"无法识别userAdapter"的错误。

核心问题2:布局绑定冲突

AbsBottom抽象类已经通过setContentView(idC)加载了布局,而SearchActivity中仍使用ActivitySearchBinding.inflate(layoutInflater)创建新的视图绑定对象,且注释了setContentView(binding.root),这会导致绑定的视图与Activity当前显示的视图不是同一个实例,后续对binding.recyclerProfile的操作无法作用到实际界面上。

修复后的SearchActivity代码

class SearchActivity : AbsBottom(R.layout.activity_search, R.id.bottomNav, R.id.search_nav) {

    private var user = mutableListOf(UserSearch()) 
    private var userAdapter = UserViewHolder()
    lateinit var binding: ActivitySearchBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 绑定已通过AbsBottom加载的布局,而非重新inflate
        binding = ActivitySearchBinding.bind(findViewById(android.R.id.content))
        
        //layout
        binding.recyclerProfile.setHasFixedSize(true)
        val llm = LinearLayoutManager(this)
        llm.orientation = LinearLayoutManager.VERTICAL
        binding.recyclerProfile.layoutManager = llm
        
        //region Adapter Setup
        binding.recyclerProfile.adapter = userAdapter
        binding.searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
            override fun onQueryTextSubmit(query: String?): Boolean {
                //do stuff
                return true
            }

            override fun onQueryTextChange(newText: String?): Boolean {
                //do other stuff
                return true
            }

        })
        //endregion
    }
}

关键修改点

  1. 修正userAdapter的缩进,使其与user、binding处于同一类成员作用域
  2. 使用ActivitySearchBinding.bind(findViewById(android.R.id.content))获取已加载布局的绑定对象,避免重复创建视图
  3. 补充OnQueryTextListener方法的返回值(原代码缺失,可能导致编译警告)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 15:05:31