java - 保存和检索数组并在 ListView 中显示

标签 java android listview sharedpreferences

我正在创建一个日志,我试图在其中存储用户创建的几个字符串,这些字符串随后在我的 ListView (lwItems)中检索并显示。但是,我当前的问题是,每当用户写入字符串时,整个表都会被覆盖。如何更改我的代码,以便将数组保存到共享首选项并将字符串附加到其中而不破坏以前的条目?这是我的 java 类 - (“customValues”由我的类传递给它,用户在其中输入字符串)

public class Training1 extends Fragment implements View.OnClickListener, AdapterView.OnItemClickListener {

    private ListView lwItems;
    private Button btnChangeItems;    
    private String DEFAULT_ITEMS_VALUES_STRING = "Item 1; Item 2";
    private String customItemString;
    private static SharedPreferences preferenceItems;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {


        View rootView = inflater.inflate(R.layout.content_main, container, false);

        lwItems = (ListView) rootView.findViewById(R.id.lwItems);
        preferenceItems = getActivity().getSharedPreferences("items", 0);

        setHasOptionsMenu(true);

        return rootView;
    }

    @Override
    public void onCreateOptionsMenu(
            Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.traning_menu_itemdetail, menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // handle item selection
        switch (item.getItemId()) {
            case R.id.action_add:
                Intent trainingCreateIntent = new Intent(getContext(), Training2.class);
                startActivity(trainingCreateIntent);
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        Bundle setItemsIntent = getActivity().getIntent().getExtras();
        if (setItemsIntent != null) {
            customItemString = getActivity().getIntent().getExtras().getString("customValues");
        }

        String[] items;
        String preferenceItemsString = preferenceItems.getString("customValues", null);
        if (preferenceItemsString != null) {
            items = getSplitAndTrim(preferenceItemsString);
        } else {
            items = getSplitAndTrim(DEFAULT_ITEMS_VALUES_STRING);
        }

        ArrayAdapter<String> arrayAdapter =
                new ArrayAdapter<>(getActivity(), android.R.layout.simple_expandable_list_item_1, items);
        lwItems.setAdapter(arrayAdapter);
        lwItems.setOnItemClickListener(this);

    }

    @Override
    public void onPause() {
        super.onPause();
        if (customItemString != null) {
            putStringInPreferences("customValues", customItemString);
        }
    }

    @Override
    public void onClick(View v) {

        Intent intent = new Intent(getActivity(), Training2.class);
        startActivity(intent);
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        String textOfItem = String.valueOf(((TextView) view).getText());
        Toast.makeText(getActivity(), textOfItem, Toast.LENGTH_SHORT).show();
    }

    public static void putStringInPreferences(String key, String customItemString) {
        SharedPreferences.Editor editor = preferenceItems.edit();
        editor.putString(key, customItemString);
        editor.commit();
    }

    @NonNull
    private String[] getSplitAndTrim(String preferenceItemsString) {
        return preferenceItemsString.trim().split("\\s*;\\s*");
    }
}

最佳答案

我猜想在这个方法中:

public static void putStringInPreferences(String key, String customItemString) {
    SharedPreferences.Editor editor = preferenceItems.edit();
    editor.putString(key, customItemString);
    editor.commit();
}

您需要首先读出原始值,附加新项目,然后写出新字符串。此代码只是在每次调用时用新字符串覆盖旧字符串。

关于java - 保存和检索数组并在 ListView 中显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35282584/

相关文章:

java - 在 Java 中使用相同的 jButton 向 MySQL 中插入和更新数据

android - PhoneGap 播放 m3u8 视频

java - 如何将文件保存在下载目录中?

c# - 用于 Windows 窗体应用程序 ListView 项(小图标 View )的最佳图标大小是多少

java - Spring + Hibernate 自动发现带注释的类?

java - Sugar ORM Android 应用程序在导航到新屏幕时丢失持久对象的 id 字段

java - 如何从http响应中获取服务器名称

android - 选择 ListView 的所有项目(带有复选框的自定义行)

java - Android - 具有 2 个 TextView 的 ListView 获取点击了哪一个

android - 一个 ListView 中的两个适配器