如何使用ArrayList 在sharedpreferences中保存/检索
我编译列表: titleList.add(0, title)
,将它应用于sharedpreferences: prefs.putString(TITLES, title).apply()
,现在需要检索它。
我在这里看了很多解决方案,似乎没有一个能够很好地解决我的问题。 该程序假设用户输入文本并使用SharedPreferences
保存它,因此稍后可以在ListActivity
使用它。 这个列表目前是一个ArrayList
(我相信我需要它在数组列表中,因为我使用AutoCompleteEditText
来获取数组列表中的建议,所以我需要适配器)。
基于上述逻辑, prefs
是一个充满字符串对象的共享首选对象。 我尝试过使用prefs.getAll().values.toArray(new String[0
… 100])
。 我发现在一本“Android”书中。 它有效,但只获得第一项。 在尝试方法之后, Set
和其他一些方法,这就是获得任何东西的方法。
我需要让程序完美地工作。 有人可以帮助获取此列表以保存在共享首选项中,将其作为完整的拆分列表(可以编制索引)检索并将其传递给ListActivity
吗?
ArrayList titleList = new ArrayList(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_make_lyric); autoCompleteAdapter = new ArrayAdapter( this, android.R.layout.simple_list_item_1, titleList ); lyricTitle.setAdapter(autoCompleteAdapter); lyricTitle.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { // load in song when selected from auto-complete list lyricHolder.setText(openSongFile(lyricTitle.getText().toString())); } }); saveBtn = (Button) findViewById(R.id.saveBtn); saveBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { performSave(); } }); titlePref = getSharedPreferences(titlePrefFile, MODE_PRIVATE); //titleList = titlePref.getAll().values().toArray(); } private void performSave() { String title = lyricTitle.getText().toString(); String song = lyricHolder.getText().toString(); if(!areFieldsNull(title, song)) { saveSongFile(title, song); warnSave.show(); } else warnEmpty.show(); } private void saveSongFile(String title, String song) { BufferedWriter bufferWriter = null; try { FileOutputStream fos = openFileOutput(title, Context.MODE_PRIVATE); bufferWriter = new BufferedWriter(new OutputStreamWriter(fos)); bufferWriter.write(song); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { bufferWriter.close(); } catch (IOException e) { e.printStackTrace(); } } //update song title list adapter autoCompleteAdapter = new ArrayAdapter( this, android.R.layout.simple_list_item_1, titleList ); lyricTitle.setAdapter(autoCompleteAdapter); titleList.add(0,title); prefEditor = titlePref.edit(); prefEditor.putString("titleList", title).apply(); }
对不起,格式化代码对我不起作用。 谢谢你,节日快乐!
我认为你需要使用ObjectSerializer 。
保存 :
ArrayList strings = new ArrayList (); string.add("Hello!"); //save list into SP SharedPreferences prefs = getSharedPreferences(SHARED_PREFS_FILE, Context.MODE_PRIVATE); Editor editor = prefs.edit(); try { editor.putString("LIST", ObjectSerializer.serialize(strings)); } catch (IOException e) { e.printStackTrace(); } editor.commit();
恢复:
// load list from preference SharedPreferences prefs = getSharedPreferences(SHARED_PREFS_FILE, Context.MODE_PRIVATE); ArrayList strings = new ArrayList (); try { strings = (ArrayList ) ObjectSerializer.deserialize(prefs.getString("LIST", ObjectSerializer.serialize(new ArrayList ()))); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); }
或使用parcelable包装来保存/检索您的数据
谢尔盖的回答可能没问题。 另外,在这个post上看一下JPM的答案和类。 我昨天用过它。
所以,使用JPM的类,这里写的是myBigArrayList:
// write data file for later use String ser = SerializeObject.objectToString(myBigArrayList); if (ser != null && !ser.equalsIgnoreCase("")) { SerializeObject.WriteSettings(c, ser, "myobject.dat"); } else { SerializeObject.WriteSettings(c, "", "myobject.dat"); }
而且,这是我改编的方法,它返回一个完整的,完整的arraylist:
private ArrayList getYabbaData() { String ser = SerializeObject.ReadSettings(getActivity().getApplicationContext(), "myobject.dat"); ArrayList give = null; if (ser != null && !ser.equalsIgnoreCase("")) { Object obj = SerializeObject.stringToObject(ser); // Then cast it to your object and if (obj instanceof ArrayList) { // Do something give = (ArrayList ) obj; } } return give; }
在写入中,我使用c作为我的应用程序上下文,我在getApplicationContext()中传递了它。
在读取中,我使用了getActivity()。getApplicationContext(),因为我在一个片段中。 在我的yabbaData对象的String中,在ArrayList中,我认为它已经可以使用了。