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

Android食谱应用中如何获取最近使用的三个食谱的索引?

实现最近浏览食谱功能的方案

要获取并展示最近使用的三个食谱索引,核心是记录用户的浏览行为并持久化存储,再在主页面读取并渲染。以下是具体实现步骤:

1. 记录最近浏览的食谱索引

每次用户打开某个食谱时,把该食谱的索引存入最近列表,同时处理重复和数量限制:

  • 重复的索引要移到列表最前面(保证最新浏览的在前)
  • 列表最多保留3个索引,超过则移除最早的

在MainActivity中添加一个保存最近记录的方法:

private void saveRecentRecipe(int recipeIndex) {
    // 用SharedPreferences持久化存储,重启APP后记录不会丢失
    SharedPreferences prefs = getSharedPreferences("RecentRecipes", MODE_PRIVATE);
    Set<String> recentSet = prefs.getStringSet("recent_indices", new HashSet<>());
    
    // 先移除已存在的索引,避免重复显示
    recentSet.remove(String.valueOf(recipeIndex));
    
    // 用LinkedHashSet保持顺序,新索引放在最前面
    LinkedHashSet<String> orderedSet = new LinkedHashSet<>();
    orderedSet.add(String.valueOf(recipeIndex));
    orderedSet.addAll(recentSet);
    
    // 限制最多保存3条记录
    if (orderedSet.size() > 3) {
        List<String> tempList = new ArrayList<>(orderedSet);
        orderedSet.clear();
        orderedSet.addAll(tempList.subList(0, 3));
    }
    
    // 保存更新后的列表
    prefs.edit().putStringSet("recent_indices", orderedSet).apply();
}

然后在打开食谱的方法中调用这个保存逻辑:

public void openRecipe(int recipeIndex){
    saveRecentRecipe(recipeIndex); // 新增:记录浏览行为
    Intent sup = new Intent(this, Example.class);
    sup.putExtra("recipeIndex", recipeIndex);
    startActivity(sup);
    finish();
}

2. 在主页面读取并渲染最近浏览按钮

在MainActivity的onCreate方法中,读取存储的最近索引,给三个ImageButton设置对应食谱的图片和点击事件:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    hideSystemUI();

    ReceiptsBase receiptsBase = new ReceiptsBase(); // 初始化食谱数据库

    // ... 原有按钮初始化代码 ...

    ImageButton recent1 = findViewById(R.id.rec1);
    ImageButton recent2 = findViewById(R.id.rec2);
    ImageButton recent3 = findViewById(R.id.rec3);

    // 读取最近浏览的索引
    SharedPreferences prefs = getSharedPreferences("RecentRecipes", MODE_PRIVATE);
    Set<String> recentSet = prefs.getStringSet("recent_indices", new HashSet<>());
    List<Integer> recentIndices = new ArrayList<>();
    for (String s : recentSet) {
        recentIndices.add(Integer.parseInt(s));
    }

    // 批量处理三个最近按钮
    List<ImageButton> recentButtons = Arrays.asList(recent1, recent2, recent3);
    for (int i = 0; i < recentButtons.size(); i++) {
        ImageButton btn = recentButtons.get(i);
        if (i < recentIndices.size()) {
            int recipeIndex = recentIndices.get(i);
            ArrayList<Integer> recipe = receiptsBase.getReceipt(recipeIndex);
            // 设置食谱封面图(数据库中第一个元素是封面drawable ID)
            btn.setImageDrawable(getDrawable(recipe.get(0)));
            // 设置点击跳转事件
            btn.setOnClickListener(v -> openRecipe(recipeIndex));
            btn.setVisibility(View.VISIBLE);
        } else {
            // 没有足够的浏览记录时,隐藏按钮或设置默认占位图
            btn.setVisibility(View.GONE);
            // 可选:btn.setImageDrawable(getDrawable(R.drawable.default_recent_placeholder));
        }
    }
}

关键细节说明

  • 持久化选择:用SharedPreferences是因为它轻量,适合存储少量简单数据(比如索引),如果后续需要更复杂的记录(比如浏览时间),可以考虑用Room数据库。
  • 顺序保证:LinkedHashSet能保持元素的插入顺序,确保最新浏览的食谱始终显示在第一个位置。
  • 去重处理:用户重复打开同一个食谱时,会先移除旧的记录再添加到最前面,避免列表中出现重复项。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 19:55:19