Android 从详情Fragment添加的书签未存入SQLite且不在收藏列表显示
问题根因
你在详情页操作书签不生效的核心问题是操作的是没有有效ID的空Word对象:
- 列表页操作书签时,用的是从数据库查询出来的、带有真实唯一ID的Word实例,调用
bookmark/deleteBookmark方法时,传入的ID是有效的,能匹配到数据库里对应行完成更新 - 详情页的
WordCheck方法里直接new Word()创建了一个空实例,这个实例的ID是默认值(通常是0),数据库中没有对应ID的行,更新操作相当于执行了但没有匹配到任何数据,自然不会有效果,而Toast是你逻辑里固定触发的,所以只会弹提示但实际没修改数据 - 补充隐藏问题:列表跳转到详情页时,没有传递单词的唯一ID,也没有在详情页查询数据库获取当前单词的真实数据
修复步骤
1. 修改列表跳转逻辑,传递单词ID
修改RecyclerViewAdapter中ViewHolder的onClick方法,把单词ID也传到详情页:
@Override public void onClick(View view) { int position = this.getAdapterPosition(); Word word = wordList.get(position); String sanskrit = word.getSanskrit(); String bangla = word.getBangla(); Intent intent = new Intent(context, TermThreeDetailsActivity.class); // 新增传递单词ID intent.putExtra("Rid", word.getId()); intent.putExtra("Rsanskrit", sanskrit); intent.putExtra("Rbangla", bangla); context.startActivity(intent); }
2. 详情页新增成员变量存储真实单词数据,查询数据库获取实例
修改TermThreeDetailsFragment代码:
// 新增成员变量存储当前展示的真实单词实例 private Word currentWord; public void getData() { Intent intent = getActivity().getIntent(); String sanskrit = intent.getStringExtra("Rsanskrit"); String bangla = intent.getStringExtra("Rbangla"); int wordId = intent.getIntExtra("Rid", -1); termTextView.setText(sanskrit); descTextView.setText(bangla); // 通过ID查询数据库拿到真实的单词实例 // 你也可以补充一个DictionaryDB的getWordById方法,这里先用已有方法实现 List<Word> matchWords = dictionaryDB.getWords(sanskrit); if (matchWords != null && !matchWords.isEmpty()) { for (Word w : matchWords) { if (w.getId() == wordId && w.getBangla().equals(bangla)) { currentWord = w; break; } } } }
3. 修改详情页书签操作逻辑,用真实单词实例操作
private void WordCheck() { // 用查询到的真实实例判断书签状态 if(currentWord != null && DictionaryDB.BOOKMARKED.equals(currentWord.status)) { imgBtn.setImageResource(R.drawable.cards_heart); } else { imgBtn.setImageResource(R.drawable.cards_heart_grey); } imgBtn.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { if (currentWord == null) { Toast.makeText(getContext(), "单词数据加载异常,请重试", Toast.LENGTH_SHORT).show(); return; } bookMarkWord(currentWord, imgBtn); } }); }
4. 补充收藏页自动刷新逻辑(可选,解决新增书签后收藏页不更新的问题)
在FavoritesFragment中新增onResume生命周期方法,回到页面时重新加载数据:
@Override public void onResume() { super.onResume(); List<Word> wordList = dictionaryDB.getBookmarkedWords(); if (rvFavAdapter != null) { // 你需要在FavoriteAdapter中新增updateData方法,替换列表数据后调用notifyDataSetChanged rvFavAdapter.updateData(wordList); } else if (wordList.size() > 0) { // 之前无收藏数据,现在有数据时初始化适配器 layoutManager = new LinearLayoutManager(getContext()); rv.setLayoutManager(layoutManager); rv.setHasFixedSize(true); rvFavAdapter = new FavoriteAdapter(getContext(), dictionaryDB,wordList); rv.setAdapter(rvFavAdapter); } }
内容的提问来源于stack exchange,提问作者Premjit
相关产品推荐
相关产品推荐

