如何将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
相关产品推荐
相关产品推荐

