使用 SharedPreferences 保存 listView 项目

问题描述 投票:0回答:1

我想接收用户的列表视图项目。通过按下按钮,编辑文本中的值将被输入到列表中。并保存此列表。这样关闭程序就不会破坏列表。我正在尝试使用共享首选项。问题出在尺寸上。当然,据我检查和测试。如果您能使用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);

            }
        });


    }
}
java android listview save sharedpreferences
1个回答
0
投票

我每次都能够更新列表视图,而无需使用 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();
            }
        });


    }
}
© www.soinside.com 2019 - 2024. All rights reserved.