Android:应用程序关闭后将值保留在列表中

2023-12-19

我目前正在尝试开发一个用作购物清单的应用程序,用户在其中输入文本EditText,按Button,然后将该值保存到List,然后更新ListView以其价值。该应用程序运行良好,除非用户退出应用程序,在这种情况下,用户输入的所有值都不会保存。这是我迄今为止尝试存储的List.

public class MainActivity extends ListActivity {

    private static final String SHARED_PREFS_NAME = "MY_SHARED_PREF";

    ArrayList<String> mylist = new ArrayList<String>();
    ArrayAdapter<String> adapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        ListView listview = (ListView) findViewById(android.R.id.list);

        Button btn = (Button) findViewById(R.id.button);

        mylist = (ArrayList<String>) getArray();

        adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mylist);

        OnClickListener listener = new OnClickListener() {          
            @Override
            public void onClick(View v) {                               
                EditText edit = (EditText) findViewById(R.id.edittext);
                mylist.add(edit.getText().toString());
                edit.setText("");               
                adapter.notifyDataSetChanged();
            }
        };

        btn.setOnClickListener(listener);

        listview.setAdapter(adapter);   

    }

    public boolean saveArray() {

        SharedPreferences sp = this.getSharedPreferences(SHARED_PREFS_NAME, Activity.MODE_PRIVATE);
        SharedPreferences.Editor mEdit1 = sp.edit();
        Set<String> set = new HashSet<String>();
        set.addAll(mylist);        
        mEdit1.putStringSet("list", set);

        return mEdit1.commit();     

    }

    public List<String> getArray() {

        SharedPreferences sp = this.getSharedPreferences(SHARED_PREFS_NAME, Activity.MODE_PRIVATE);
        Set<String> set = sp.getStringSet("list", new HashSet<String>());
        return new ArrayList<String>(set);
    }

}

并在我的.xml我有布局文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <EditText
        android:id="@+id/edittext"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:ems="10" >

        <requestFocus />
    </EditText>

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/edittext"
        android:text="Button" />

    <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/button" >
    </ListView>

</RelativeLayout>

我有它,以便可以将值输入到ListView正确,但是ListView应用程序退出并重新打开后不会保存其值。有谁知道为什么会发生这种情况?


您的问题的解决方案如下:

我尝试并修改了你的代码也感谢这个link https://stackoverflow.com/questions/7057845/save-arraylist-to-sharedpreferences:

public class MainActivity extends ListActivity {

    private static final String SHARED_PREFS_NAME = "MY_SHARED_PREF";
    ArrayList<String> mylist = new ArrayList<String>();
    ArrayAdapter<String> adapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ListView listview = (ListView) findViewById(R.id.list);
        Button btn = (Button) findViewById(R.id.button);

        //NOTE: acquire array from shared preferences
        mylist = getArray();

        adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mylist);

        OnClickListener listener = new OnClickListener() {          
            @Override
            public void onClick(View v) {                               
                EditText edit = (EditText) findViewById(R.id.edittext);
                mylist.add(edit.getText().toString());
                edit.setText("");               
                adapter.notifyDataSetChanged();
            }
        };
        btn.setOnClickListener(listener);
        listview.setAdapter(adapter);        
    }

    public boolean saveArray() {
        SharedPreferences sp = this.getSharedPreferences(SHARED_PREFS_NAME, Activity.MODE_PRIVATE);
        SharedPreferences.Editor mEdit1 = sp.edit();
        Set<String> set = new HashSet<String>();
        set.addAll(mylist);
        mEdit1.putStringSet("list", set);
        return mEdit1.commit();
    }

    public ArrayList<String> getArray() {
        SharedPreferences sp = this.getSharedPreferences(SHARED_PREFS_NAME, Activity.MODE_PRIVATE);

        //NOTE: if shared preference is null, the method return empty Hashset and not null          
        Set<String> set = sp.getStringSet("list", new HashSet<String>());

        return new ArrayList<String>(set);
    }
}

..并在关闭应用程序之前调用 SaveArray ()

public void onStop() {
    saveArray();
    super.onStop();
}

或者,每次添加元素时保存数组(all'onclick 按钮会覆盖当前列表中的共享首选项)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android:应用程序关闭后将值保留在列表中 的相关文章

随机推荐

  • 禁用 woocommerce_checkout_update_customer_data

    如果用户输入不同的地址 我试图阻止 woocommerce 在结账时更新用户元 保存的账单和送货用户地址 在 class wc checkout php 中有一个 woocommerce checkout update customer d
  • 分配(而不是定义) __getitem__ 魔术方法会破坏索引[重复]

    这个问题在这里已经有答案了 我有一个类似于此 高度简化 示例的包装类 class wrap object def init self self data range 10 def getitem self key return self d
  • 是否可以创建更好版本的“std::min”和“std::max”?

    借助C 17的新特性 是否有可能创建出更好的std min and std max 我所说的更好是什么意思 std min max有问题悬空引用 https stackoverflow com questions 13721839 if s
  • C# 中柯里化的优点是什么? (实现部分功能)

    C 中柯里化的优点是什么 在柯里化函数上实现部分函数应用有什么好处 如果您的问题是如何在 C 中实现柯里化 这里有一个示例 public Func
  • 静态变量和方法

    我遇到一个这样设置的类 public class MyClass private static boolean started false private MyClass public static void doSomething if
  • Flutter - 方法“map”被调用为空

    我在尝试使用对象模型从 api JSON 添加元素时收到以下错误DropdownMenuItem 这是错误 The method map was called on null Receiver null Tried calling map
  • 在 C# 中列出文件夹内的重复文件:利用 LINQ.AsParallel

    我已将以下算法写入 C 代码中 以递归方式列出文件夹内的文件 开始遍历目录及其子目录中的文件列表 将文件名和路径存储在列表中 如果当前文件与列表中的任何其他文件匹配 则在 将两个文件标记为重复 从列表中获取所有标记为重复的文件 按名称和返回
  • vuejs 中缺少 webpack 配置

    我的 vuejs 应用程序的 package json 看起来像 package json name vue app version 0 1 0 private true scripts serve vue cli service serv
  • FFmpeg 从 UYVY422 转换为 YUV420P

    我有 UYVY422 格式的原始视频 我想将其转换为 YUV420p 我正在执行该命令 ffmpeg y r 25 0 f rawvideo s 1920x1080 pix fmt uyvy422 i input avi pix fmt y
  • 创建 QName 时本地部分不能为“null”

    我们正在努力追踪一个错误 我们在日志中收到上述错误 谁能解释一下这条消息的含义吗 收到此消息有什么典型原因吗 堆栈跟踪是 org apache axiom om OMException java lang IllegalArgumentEx
  • 从 PowerPoint VBA 提取 OLEObject(XML 文档)

    我正在用 VBA 开发一个应用程序 用户窗体连接到读取 SPSS Statistics SAV 文件或 SPSS Dimensions MDD 文件的 COM 对象 该应用程序的一部分将元数据存储在 XML 文档中 以便我们稍后可以检索元数
  • 基于 If-Modified-Since 标头修改 REST API 表示是否有效?

    我想在我的 API 中实现 获取更改值 功能 例如 假设我有以下 REST API 调用 GET ws school 7 student 这得到了 7 学校的所有学生 不幸的是 这可能很多 因此 我想修改 API 以仅返回自特定时间以来已修
  • 为什么每次我运行/调试我的应用程序时,RubyMine 2.0.2 都会在不同的端口上启动 Webrick?

    每次我在 RubyMine 下启动 Rails 2 3 8 Web 应用程序时 它都使用不同的端口 这让我很生气 因为每次我想测试某些东西时都必须更改浏览器中的 URL 我找不到任何配置选项来更改它 任何人 这可能没有帮助 因为我使用的是
  • 当变量明确存在时,Javassist 没有这样的字段

    我正在尝试使用 javassist 将代码注入到 minecraft 1 8 jar 中 这insertBefore insertAfter方法工作得很好 但 insert at 方法并没有按预期工作 我收到此错误 https gist g
  • C strndup 隐式声明

    我正在尝试使用strndup函数 但我收到错误 错误 函数 strndup 的隐式声明 Werror 隐式函数声明 我四处搜索 发现它不是标准函数 因此我必须使用不同的标志进行编译 但是 我通过编译以下内容收到了同样的问题 std gnu1
  • 为孩子们建立安全的搜索引擎?

    我今年的项目 为孩子们建立安全的搜索引擎 所以我需要一些信息 1 在哪里可以找到有关该主题的一些研究 论文 2 如何利用开源工具 3 我的项目需要学习哪些技术 和一些建议请 thanks 更新 安全意味着当孩子们搜索任何内容时他们看不到相关
  • PHP 从数据库中下拉数据

    我正在尝试做一个select field根据我的数据库获取数据 所以 基本上 我希望它为我的数据库中的所有用户提供一个下拉菜单 所以就像而不是这样做
  • 导入错误:无法导入名称“keras”

    在 Jupyter 笔记本 python 中运行此命令时 import tensorflow as tf from tensorflow import keras 我收到此错误 ImportError cannot import name
  • C# 中的字符串将单引号替换为双引号

    如何在 C 字符串中用双引号 替换单引号 您需要对引号符号使用正确的转义序列 您可以找到有关转义序列的更多信息here http msdn microsoft com en us library h21280bw aspx String s
  • Android:应用程序关闭后将值保留在列表中

    我目前正在尝试开发一个用作购物清单的应用程序 用户在其中输入文本EditText 按Button 然后将该值保存到List 然后更新ListView以其价值 该应用程序运行良好 除非用户退出应用程序 在这种情况下 用户输入的所有值都不会保存