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

如何在Shared Preferences中追加字符串及跨Activity展示分数列表

嘿,别折腾两个SharedPreferences啦,完全没必要!咱们用一个就搞定——因为SharedPreferences本身不支持直接存储列表,但我们可以把分数列表转成JSON字符串存进去,读取的时候再转回来就行。我给你一步步写代码,你跟着试:

第一步:在测试Activity中存储分数

这里我推荐用Gson来序列化/反序列化列表(比原生JSON更简单),首先要在你的build.gradle(Module级)里加Gson依赖:

dependencies {
    implementation 'com.google.code.gson:gson:2.10.1'
}

然后在测试Activity里写存储逻辑,每次得到新分数就追加到已有列表中:

// 获取SharedPreferences实例,"ScorePrefs"是自定义的存储名称,你可以随便改
SharedPreferences sharedPref = getSharedPreferences("ScorePrefs", MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();

Gson gson = new Gson();
// 先读取已有的分数列表,如果是第一次存就用空数组"[]"初始化
String existingScoresJson = sharedPref.getString("scores_list", "[]");
List<Integer> scoresList = gson.fromJson(existingScoresJson, new TypeToken<List<Integer>>(){}.getType());

// 替换成你实际获取到的测试分数
int newTestScore = 92;
scoresList.add(newTestScore);

// 把更新后的列表转成JSON字符串存回去
String updatedScoresJson = gson.toJson(scoresList);
editor.putString("scores_list", updatedScoresJson);
editor.apply(); // 异步提交,比commit()更推荐

如果你不想用Gson,也可以用原生JSONAPI实现:

SharedPreferences sharedPref = getSharedPreferences("ScorePrefs", MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();

String existingScoresJson = sharedPref.getString("scores_list", "[]");
try {
    JSONArray jsonArray = new JSONArray(existingScoresJson);
    jsonArray.put(92); // 追加新分数
    editor.putString("scores_list", jsonArray.toString());
    editor.apply();
} catch (JSONException e) {
    e.printStackTrace();
}
第二步:在第二个Activity中展示分数列表

我用RecyclerView来做展示(现在Android的主流列表组件),步骤如下:

1. 先写列表项布局(res/layout/item_score.xml)

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/tv_score"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="16dp"
    android:textSize="18sp"
    android:textColor="#333333"/>

2. 写RecyclerView的Adapter类

public class ScoreAdapter extends RecyclerView.Adapter<ScoreAdapter.ScoreViewHolder> {

    private List<Integer> mScoreList;

    public ScoreAdapter(List<Integer> scoreList) {
        mScoreList = scoreList;
    }

    @NonNull
    @Override
    public ScoreViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_score, parent, false);
        return new ScoreViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull ScoreViewHolder holder, int position) {
        int score = mScoreList.get(position);
        holder.tvScore.setText(String.valueOf(score));
    }

    @Override
    public int getItemCount() {
        return mScoreList.size();
    }

    static class ScoreViewHolder extends RecyclerView.ViewHolder {
        TextView tvScore;

        public ScoreViewHolder(@NonNull View itemView) {
            super(itemView);
            tvScore = itemView.findViewById(R.id.tv_score);
        }
    }
}

3. 第二个Activity的布局(res/layout/activity_score_list.xml)

<?xml version="1.0" encoding="utf-8"?>
<androidx.recyclerview.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/recycler_view_scores"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="8dp"/>

4. 第二个Activity的核心代码

public class ScoreListActivity extends AppCompatActivity {

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

        RecyclerView recyclerView = findViewById(R.id.recycler_view_scores);
        // 设置列表为垂直布局
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

        // 读取SharedPreferences里的分数列表
        SharedPreferences sharedPref = getSharedPreferences("ScorePrefs", MODE_PRIVATE);
        String scoresJson = sharedPref.getString("scores_list", "[]");

        // 用Gson转成List
        Gson gson = new Gson();
        List<Integer> scoresList = gson.fromJson(scoresJson, new TypeToken<List<Integer>>(){}.getType());

        // 设置Adapter展示列表
        ScoreAdapter adapter = new ScoreAdapter(scoresList);
        recyclerView.setAdapter(adapter);
    }
}
最后几个小提示
  • 记得在AndroidManifest.xml里注册你的ScoreListActivity哦!
  • 如果你的分数是浮点型(比如89.5),只要把代码里的Integer换成Float就行,逻辑完全一样。
  • 要是你觉得RecyclerView太复杂,用ListView也可以,把Adapter换成BaseAdapter就行,核心的读取逻辑不变。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:21:02