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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 05:06:07