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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 07:09:01