如何使用ArrayList 在sharedpreferences中保存/检索

我编译列表: titleList.add(0, title) ,将它应用于sharedpreferences: prefs.putString(TITLES, title).apply() ,现在需要检索它。


我在这里看了很多解决方案,似乎没有一个能够很好地解决我的问题。 该程序假设用户输入文本并使用SharedPreferences保存它,因此稍后可以在ListActivity使用它。 这个列表目前是一个ArrayList (我相信我需要它在数组列表中,因为我使用AutoCompleteEditText来获取数组列表中的建议,所以我需要适配器)。


基于上述逻辑, prefs是一个充满字符串对象的共享首选对象。 我尝试过使用prefs.getAll().values.toArray(new String[0100]) 。 我发现在一本“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中,我认为它已经可以使用了。