RecyclerView适配报错:SearchAdapter无法应用问题求助
解决SearchAdapter实例化时的“无法应用”错误
你遇到的这个“无法应用”错误,本质是参数类型不匹配——也就是SearchAdapter构造函数期望接收的数据类型,和mOwnerDao.getOwner()、getOwnerByName(text)返回的类型对不上,编译器找不到匹配的构造函数,所以报错了。
先把你给出的代码片段整理清楚:
你的Activity代码片段:
adapter = new SearchAdapter(this.mOwnerDao.getOwner()); recyclerView.setAdapter(adapter); } private void startSearch(String text) { adapter = new SearchAdapter(this.mOwnerDao.getOwnerByName(text)); recyclerView.setAdapter(adapter); }
你的SearchAdapter定义片段:
public class SearchAdapter extends RecyclerView.Adapter<SearchViewHolder>{ private...
接下来一步步排查解决:
1. 补全并确认SearchAdapter的构造函数类型
首先你需要明确SearchAdapter的构造函数到底接收什么类型的参数。绝大多数RecyclerView适配器会接收一个数据集合,假设你的业务是展示Owner对象列表,那Adapter应该补全成这样:
public class SearchAdapter extends RecyclerView.Adapter<SearchViewHolder>{ // 存储列表数据的集合 private List<Owner> mOwnerList; // 构造函数,明确声明接收List<Owner>类型的参数 public SearchAdapter(List<Owner> ownerList) { mOwnerList = ownerList; } // 记得重写RecyclerView.Adapter的三个核心方法: // onCreateViewHolder、onBindViewHolder、getItemCount }
2. 检查DAO方法的返回值类型
接下来重点看你的mOwnerDao里的两个方法:
getOwner()getOwnerByName(String text)
这两个方法的返回值必须和Adapter构造函数的参数类型完全匹配。比如Adapter要List<Owner>,那DAO方法就不能返回Cursor、LiveData<List<Owner>>或者其他不兼容的类型。
举个Room DAO的正确示例:
@Dao public interface OwnerDao { // 返回List<Owner>,和Adapter构造参数类型一致 @Query("SELECT * FROM owner") List<Owner> getOwner(); @Query("SELECT * FROM owner WHERE name LIKE '%' || :text || '%'") List<Owner> getOwnerByName(String text); }
3. 如果DAO返回LiveData,改用观察模式
如果你的DAO方法返回的是LiveData<List<Owner>>(这是Room推荐的异步数据获取方式),那你不能直接调用方法获取数据,而是要在Activity里观察LiveData的变化:
// 初始化列表数据 mOwnerDao.getOwner().observe(this, ownerList -> { adapter = new SearchAdapter(ownerList); recyclerView.setAdapter(adapter); }); // 搜索方法的正确写法 private void startSearch(String text) { // 先移除之前的观察者,避免重复回调 mOwnerDao.getOwnerByName(text).removeObservers(this); mOwnerDao.getOwnerByName(text).observe(this, ownerList -> { adapter = new SearchAdapter(ownerList); recyclerView.setAdapter(adapter); }); }
核心总结:这个“无法应用”错误就是参数类型不兼容导致的,只要把SearchAdapter构造函数的参数类型,和DAO方法的返回值类型统一起来,问题就能解决。
内容的提问来源于stack exchange,提问作者scarlet pro
相关产品推荐
相关产品推荐

