我想接收用户的列表视图项目。通过按下按钮,编辑文本中的值将被输入到列表中。并保存此列表。这样关闭程序就不会破坏列表。我正在尝试使用共享首选项。问题出在尺寸上。当然,据我检查和测试。如果您能使用sharedPreferences 提供解决方案,我将不胜感激。 sizeArrayList = sp.getInt("大小",0);这条线做得有点正确。问题是,通过添加新项并退出程序,该键的值从零开始。因此,列表项并未全部加载。实际上,所有项目都正确地存在于与设备文件资源管理器中的sharedPreferences 相关的xml 中。问题是更改“size”键的值。
package com.example.todolist;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
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 android.widget.Toast;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
EditText edtName;
Button btnAddAndSave, btnGo;
ListView lsv;
public static ArrayList<String>nameArrayList = new ArrayList<>();
static public SharedPreferences sp;
ArrayAdapter<String> adapter;
int counter;
int sizeArrayList;
String nam;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edtName = findViewById(R.id.edtName);
btnAddAndSave = findViewById(R.id.btnAndAndSave);
btnGo = findViewById(R.id.btnGo);
lsv = findViewById(R.id.lsv);
sp = getSharedPreferences("ArraySave",MODE_PRIVATE);
adapter = new ArrayAdapter(MainActivity.this, android.R.layout.simple_list_item_1, nameArrayList);
sizeArrayList = sp.getInt("size",0);
for (int i = 0 ; i < sizeArrayList; i++){
nam = sp.getString(i+"", "NameDef");
nameArrayList.add(nam);
lsv.setAdapter(adapter);
}
sp.edit().putInt("size",sizeArrayList).apply();
btnAddAndSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
adapter = new ArrayAdapter(MainActivity.this, android.R.layout.simple_list_item_1, nameArrayList);
String newItem = edtName.getText().toString();
nameArrayList.add(newItem);
for (int i = 0; i < nameArrayList.size(); i++){
sp.edit().putString(i+"", nameArrayList.get(i)).apply();
sp.edit().putInt("size",counter).apply();
}
counter++;
adapter.notifyDataSetChanged();
lsv.setAdapter(adapter);
}
});
}
}
我每次都能够更新列表视图,而无需使用 for 循环显示重复的项目。 在这里你可以看到我的解决方案。在我所做的测试中,我没有发现任何问题,但是如果您发现任何问题,如果您能告诉我,我将不胜感激。
package com.example.mynote;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.text.style.TtsSpan;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Type;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
Button btnAddNote;
ListView lsv;
ArrayList<String> nameArray = new ArrayList<>();
SharedPreferences sp;
EditText edtItem;
int counter = 1;
ArrayAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnAddNote = findViewById(R.id.btnAddNote);
lsv = findViewById(R.id.lsv);
edtItem = findViewById(R.id.edtItem);
sp = getSharedPreferences("NameSubject", MODE_PRIVATE);
adapter = new ArrayAdapter(MainActivity.this,
android.R.layout.simple_list_item_1, nameArray);
counter = sp.getInt("count", 1);
btnAddNote.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String item = edtItem.getText().toString();
sp.edit().putString("subject" + counter, item).apply();
nameArray.add(sp.getString("subject" + counter, "s"));
counter++;
sp.edit().putInt("count", counter).apply();
adapter.notifyDataSetChanged();
lsv.setAdapter(adapter);
edtItem.setText("");
}
});
for (int i = 1; i < counter; i++) {
nameArray.add(sp.getString("subject" + i, "s"));
adapter.notifyDataSetChanged();
lsv.setAdapter(adapter);
}
lsv.setAdapter(adapter);
lsv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(MainActivity.this, nameArray.get(position), Toast.LENGTH_SHORT).show();
}
});
}
}