继承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 } }
关键修改点
- 修正
userAdapter的缩进,使其与user、binding处于同一类成员作用域 - 使用
ActivitySearchBinding.bind(findViewById(android.R.id.content))获取已加载布局的绑定对象,避免重复创建视图 - 补充
OnQueryTextListener方法的返回值(原代码缺失,可能导致编译警告)
内容的提问来源于stack exchange,提问作者Interity
相关产品推荐
相关产品推荐

