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

使用SharedPreferences保存ListView项时size键值重置问题求助

问题修复:SharedPreferences保存列表后size值重置导致加载失败

问题根源

你的代码中counter变量初始值为0且从未从SharedPreferences读取已保存的列表长度,导致每次新增项时错误地将size设为从0开始递增的counter,覆盖了真实的列表长度。同时新增时的循环存储逻辑冗余且错误,每次循环都重复设置size值,进一步加剧了问题。

修复后的完整代码

package com.example.todolist;

import androidx.appcompat.app.AppCompatActivity;

import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    EditText edtName;
    Button btnAddAndSave, btnGo;
    ListView lsv;

    public ArrayList<String> nameArrayList = new ArrayList<>();
    SharedPreferences sp;
    ArrayAdapter<String> adapter;
    int listSize; // 用listSize替代counter,语义更清晰

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

        edtName = findViewById(R.id.edtName);
        btnAddAndSave = findViewById(R.id.btnAddAndSave); // 修复按钮ID拼写错误
        btnGo = findViewById(R.id.btnGo);
        lsv = findViewById(R.id.lsv);

        sp = getSharedPreferences("ArraySave", MODE_PRIVATE);

        // 仅初始化一次适配器,绑定到ListView
        adapter = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_list_item_1, nameArrayList);
        lsv.setAdapter(adapter);

        // 读取已保存的列表长度
        listSize = sp.getInt("size", 0);

        // 加载所有已保存的列表项
        for (int i = 0; i < listSize; i++) {
            String item = sp.getString(String.valueOf(i), "NameDef");
            nameArrayList.add(item);
        }
        adapter.notifyDataSetChanged(); // 加载完成后更新列表显示

        btnAddAndSave.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String newItem = edtName.getText().toString().trim();
                if (newItem.isEmpty()) {
                    return; // 过滤空输入
                }

                // 添加到内存列表并更新UI
                nameArrayList.add(newItem);
                adapter.notifyDataSetChanged();

                // 保存新项到SharedPreferences并更新列表长度
                int newItemIndex = listSize;
                sp.edit()
                        .putString(String.valueOf(newItemIndex), newItem)
                        .putInt("size", ++listSize)
                        .apply();

                // 清空输入框
                edtName.setText("");
            }
        });
    }
}

关键修改说明

  1. 读取历史列表长度:启动时从SharedPreferences读取size值赋值给listSize,确保加载时能获取真实的已保存列表长度。
  2. 简化存储逻辑:新增项时无需循环存储所有列表项,仅保存当前新增的项,并直接更新size为最新列表长度,避免冗余操作和错误覆盖。
  3. 优化适配器使用:仅初始化一次ArrayAdapter,后续通过notifyDataSetChanged()更新列表,避免重复创建对象。
  4. 修复按钮ID错误:修正原代码中btnAndAndSave的拼写错误,匹配布局文件中的btnAddAndSave。
  5. 增加空输入过滤:防止空字符串被添加到列表中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 00:42:47