使用SharedPreferences保存ListView项时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(""); } }); } }
关键修改说明
- 读取历史列表长度:启动时从SharedPreferences读取
size值赋值给listSize,确保加载时能获取真实的已保存列表长度。 - 简化存储逻辑:新增项时无需循环存储所有列表项,仅保存当前新增的项,并直接更新
size为最新列表长度,避免冗余操作和错误覆盖。 - 优化适配器使用:仅初始化一次ArrayAdapter,后续通过
notifyDataSetChanged()更新列表,避免重复创建对象。 - 修复按钮ID错误:修正原代码中
btnAndAndSave的拼写错误,匹配布局文件中的btnAddAndSave。 - 增加空输入过滤:防止空字符串被添加到列表中。
内容的提问来源于stack exchange,提问作者Parisa H
相关产品推荐
相关产品推荐

