Android实现SearchView过滤RecyclerView书籍时BookAdapter构造报错
报错根因
你自定义的BookAdapter仅提供了要求传入List<Book>和Context两个参数的构造方法,没有定义无参构造方法,所以recyclerAdapter = new BookAdapter();的无参实例化逻辑不符合构造方法参数要求,直接触发编译错误。
同时你的代码还存在多处逻辑疏漏,就算修复编译错误也会出现运行崩溃、搜索功能失效的问题,完整修复方案如下:
修复步骤
1. 修正ListBooks.java的冗余逻辑与实例化错误
你原有代码中提前实例化了一次无参Adapter,后续查询到数据后又新建了局部Adapter变量,会导致全局的recyclerAdapter为空,调用搜索接口时触发空指针崩溃,直接修改onCreate方法代码:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_listar_livros); recyclerView = findViewById(R.id.recyclerView); // 先配置RecyclerView基础属性,不要提前实例化空Adapter recyclerView.setLayoutManager(new LinearLayoutManager(this)); recyclerView.setHasFixedSize(true); DB db = new DB(this); List<Book> books = db.ReadBooks(); if (books.size() > 0){ // 直接给全局recyclerAdapter实例化,不要新建局部变量 recyclerAdapter = new BookAdapter(books,ListBooks.this); recyclerView.setAdapter(recyclerAdapter); } else { // 空数据时也初始化Adapter,避免搜索时空指针 recyclerAdapter = new BookAdapter(new ArrayList<>(), ListBooks.this); recyclerView.setAdapter(recyclerAdapter); Toast.makeText(this, "No books in database.", Toast.LENGTH_SHORT).show(); } }
2. 修正BookAdapter.java的代码错误
现有构造方法和过滤逻辑里的变量名写错,运行必崩,修改如下:
public BookAdapter(List<Book> books, Context context) { this.books = books; // 原有逻辑写错为new ArrayList<>(books2),应该备份传入的原始书籍列表 this.books2 = new ArrayList<>(books); this.context = context; // 原有变量名拼写错误,类名是DB,变量名是db,修正写法 db = new DB(context); } // ... 省略其他代码 ... // 过滤逻辑里的变量名少写了s,修正 if (book.getTitle_book().toLowerCase().contains(charSequence.toString().toLowerCase())){ filter_books.add(book); }
内容的提问来源于stack exchange,提问作者Bolacer
相关产品推荐
相关产品推荐

