从 LiveData(房间数据库)填充 Spinner [英] Populate Spinner from LiveData (Room Database)
问题描述
我在哪里
我正在尝试使用 Room 用数据库中的数据填充微调器.数据是一个术语列表,这些术语具有与之关联的课程.
I am attempting to fill a spinner with data from a database, using Room. The data is a list of terms, which have courses associated with them.
我想在创建新课程时使用微调器,以选择要与之关联的术语.
I want to use the spinner when creating a new course, to select a term to associate it with.
目前,微调器不显示默认选项,但如果您单击微调器,它会显示可供选择的数据列表.从微调器中选择某些内容后,它不会显示您选择的内容.
Currently, the spinner does not show a default option, but if you click the spinner it shows a list of the data to select from. After you select something from the spinner, it does not show what you have selected.
这是我将数据加载到微调器适配器的代码:
Here is my code for loading data into the spinner's adapter:
termsList = new ArrayList<>();
termIdList = new ArrayList<>();
mTermViewModel = new ViewModelProvider(this).get(TermViewModel.class);
mTermViewModel.getAllTerms().observe(this, new Observer<List<TermEntity>>() {
@Override
public void onChanged(@Nullable final List<TermEntity> terms) {
for (TermEntity term : terms) {
termsList.add(term.getTermName());
termIdList.add(term.getTermId());
}
}
});
ArrayAdapter<String> adapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_spinner_item, termsList);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mTermSpinner.setAdapter(adapter);
}
这里是 TermDAO
Here is the TermDAO
@Dao
public interface TermDAO {
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insert(TermEntity term);
@Query("DELETE FROM terms")
void deleteAllTerms();
@Query("SELECT * FROM terms ORDER BY termId ASC")
LiveData<List<TermEntity>> getAllTerms();
@Query("SELECT * FROM terms WHERE termId = :termId")
LiveData<List<TermEntity>> getTerm(int termId);
@Query("SELECT termId FROM terms WHERE termName = :termName")
LiveData<List<TermEntity>> getTermIdByTermName(String termName);
}
这里是 TermViewModel
Here is the TermViewModel
public class TermViewModel extends AndroidViewModel {
private SchoolTrackerRepository mRepository;
private LiveData<List<TermEntity>> mAllTerms;
public TermViewModel(@NonNull Application application) {
super(application);
mRepository = new SchoolTrackerRepository(application);
mAllTerms = mRepository.getAllTerms();
}
public LiveData<List<TermEntity>> getAllTerms() {
return mAllTerms;
}
public void insert(TermEntity termEntity) {
mRepository.insert(termEntity);
}
}
我想在微调器中显示术语名称并使用相应的 termId 来执行查询.
I want to show the term name in the spinner and use the corresponding termId to perform the query.
我的尝试
我曾尝试使用 Mutable LiveData 而不是 LiveData,但是当我尝试运行它时,我收到一个错误消息:
I have tried using Mutable LiveData instead of LiveData but when I attempted to run it, I got an error that said:
错误:不确定如何将光标转换为该方法的返回类型
Error:Not sure how to convert a Cursor to this method's return type
我真的很茫然.感谢您的帮助.
I'm really at a loss. Thanks for any help.
添加存储库
public class SchoolTrackerRepository {
private TermDAO mTermDAO;
private CourseDAO mCourseDAO;
int termId;
private LiveData<List<TermEntity>> mAllTerms;
private LiveData<List<CourseEntity>> mAllCourses;
private LiveData<List<CourseEntity>> mAssociatedCourses;
public SchoolTrackerRepository(Application application) {
SchoolTrackerDatabase db = SchoolTrackerDatabase.getDatabase(application);
mTermDAO = db.termDAO();
mCourseDAO = db.courseDAO();
mAllTerms = mTermDAO.getAllTerms();
mAllCourses = mCourseDAO.getAllCourses();
}
public LiveData<List<TermEntity>> getAllTerms() {
return mAllTerms;
}
public LiveData<List<CourseEntity>> getAllCourses() {
return mAllCourses;
}
public LiveData<List<CourseEntity>> getmAssociatedCourses(int termId) {
return mAssociatedCourses;
}
public void insert(TermEntity termEntity) {
new insertAsyncTask1(mTermDAO).execute(termEntity);
}
private static class insertAsyncTask1 extends AsyncTask<TermEntity, Void, Void> {
private TermDAO mAsyncTaskDAO;
insertAsyncTask1(TermDAO dao) {
mAsyncTaskDAO = dao;
}
@Override
protected Void doInBackground(final TermEntity... params) {
mAsyncTaskDAO.insert(params[0]);
return null;
}
}
public void insert(CourseEntity courseEntity) {
new insertAsyncTask2(mCourseDAO).execute(courseEntity);
}
private static class insertAsyncTask2 extends AsyncTask<CourseEntity, Void, Void> {
private CourseDAO mAsyncCourseDAO;
insertAsyncTask2(CourseDAO dao) {
mAsyncCourseDAO = dao;
}
@Override
protected Void doInBackground(final CourseEntity... params) {
mAsyncCourseDAO.insert(params[0]);
return null;
}
}
}
推荐答案
我猜你在更新 termsList
变量后缺少 notifyDataSetChanged.
I guess that you missing notifyDataSetChanged after update the termsList
variable.
试试这个:
ArrayAdapter<String> adapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_spinner_item, termsList);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mTermSpinner.setAdapter(adapter);
mTermViewModel = new ViewModelProvider(this).get(TermViewModel.class);
mTermViewModel.getAllTerms().observe(this, new Observer<List<TermEntity>>() {
@Override
public void onChanged(@Nullable final List<TermEntity> terms) {
for (TermEntity term : terms) {
termsList.add(term.getTermName());
termIdList.add(term.getTermId());
}
//notifyDataSetChanged after update termsList variable here
adapter.notifyDataSetChanged();
}
});
这篇关于从 LiveData(房间数据库)填充 Spinner的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!