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

如何将RingTonesDao查询的铃声列表数据正确展示到RecyclerView中

MainActivity修改方案

Room默认禁止在主线程操作数据库,所以需要把插入、查询逻辑放到子线程执行,查询到数据后切回主线程更新列表,修改后完整代码如下:

package com.example.ringtone2021;

import android.os.Bundle;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import java.util.List;

public class MainActivity extends AppCompatActivity {
    private RingTonesDao ringTonesDao;
    private RecyclerView recyclerView;
    private RingTonesAdapter ringTonesAdapter = new RingTonesAdapter();
    private TextView forexample;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        forexample = findViewById(R.id.forexample);
        recyclerView = findViewById(R.id.rv_main);
        recyclerView.setAdapter(ringTonesAdapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(this, RecyclerView.VERTICAL, false));

        ringTonesDao = AppDatabase.getAppDatabase(this).getRingtonesDao();

        // 子线程执行数据库操作
        new Thread(() -> {
            // 插入测试数据
            RingTones ringTones = new RingTones("reza", "alavi");
            ringTonesDao.add(ringTones);
            ringTones = new RingTones("ali", "alavi");
            ringTonesDao.add(ringTones);
            ringTones = new RingTones("ali", "alavi");
            ringTonesDao.add(ringTones);
            ringTones = new RingTones("ali", "alavi");
            ringTonesDao.add(ringTones);
            ringTones = new RingTones("ali", "alavi");
            ringTonesDao.add(ringTones);
            ringTones = new RingTones("ali", "alavi");
            ringTonesDao.add(ringTones);
            
            // 查询所有铃声数据
            List<RingTones> dataList = ringTonesDao.getRingTones();
            
            // 切回主线程更新列表
            runOnUiThread(() -> {
                ringTonesAdapter.setData(dataList);
            });
        }).start();
    }
}

补充说明

  • 如果需要快速调试不想用子线程,可以在AppDatabase的构建代码中添加.allowMainThreadQueries()配置,即可允许主线程操作数据库,正式上线不推荐该用法。
  • 后续如果有数据增删改操作,操作完成后重新查询数据调用setData方法即可刷新列表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 09:06:02