如何在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
相关产品推荐
相关产品推荐

