配列リストを保存String
し、それを使用してシリアル化し、ObjectSerializer
そのシリアル化されたリストをSharedPreferences
インスタンスに保存するアプリケーションがあります。
SharePreferences
これには、同じオブジェクトからの「配置」と「取得」の 2 つのアクティビティが含まれます。
でListActivity
、アイテムを長押しして削除プロセスを開始します。削除後、更新されたオブジェクトString
で を再初期化してを更新します。もう一度呼び出して再起動すると、リストにアイテムが再び表示されます。もう存在しないオブジェクトを指しているため、クリックすると が発生します ( ) 。ListAdapter
ArrayList<String>
ListView
ListAcivity
NullPointerException
null
からアイテムを削除してから、 then に入れてみましArrayList<String>
た。古い値を削除しようとしました(またはメソッドを使用)。ステップを見落としているだけかもしれませんが、何が原因なのかわかりません。ObjectSerializer
SharedPreferences
SharedPreference
clear()
remove()
別のアクティビティから同じ (正しく更新されたリスト) オブジェクトを取得できるように、オブジェクトをシリアル化ArrayList<String>
し、オブジェクトに保存しSharedPreference
、リストからアイテムを削除してアイテムを更新し、オブジェクトを更新する方法を誰かに教えてもらえますか?SharedPreference
SharedPreference
どうもありがとう!
以下は私の(短縮された)コードです:
アクティビティ 1:
public static final String TITLE_PREF = "titleList";
ArrayList<String> titleList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
saveBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
saveSongFile(title, song);
}
});
}
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 (IOException e) {
e.printStackTrace();
} finally {
try {
bufferWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
// new songs (not updated songs) go to the top
if (!titleList.contains(title))
titleList.add(0, title);
mSetTitleListAdapter(titleList);
saveTitleArray();
}
private void saveTitleArray() {
prefEditor = titlePref.edit();
try {
prefEditor.putString(TITLE_PREF, ObjectSerializer.serialize(titleList));
} catch (IOException e) {
e.printStackTrace();
}
prefEditor.apply();
}
private void mSetTitleListAdapter(ArrayList<String> List) {
autoCompleteAdapter = new ArrayAdapter<>(
this,
android.R.layout.simple_list_item_1,
List
);
titleBox.setAdapter(autoCompleteAdapter);
}
アクティビティ 2 (ListActivity):
public static final String EXTRA_NAME = "com.frankbrenyah.lyricmaker.NAME";
public static final String TITLE_PREF = "titleList";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pick_song_list);
//init string array from blank list or sharedPref saved data
songListArray = new ArrayList<>();
titlePref = getSharedPreferences(TITLE_PREF, MODE_PRIVATE);
try {
songListArray = (ArrayList<String>) ObjectSerializer.deserialize(
titlePref.getString(TITLE_PREF,
ObjectSerializer.serialize(new ArrayList<String>())
)
);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
mSetListAdapter(songListArray);
getListView().setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) {
final AlertDialog.Builder confirmDel = new AlertDialog.Builder(pickSong_List.this);
confirmDel.setTitle("Delete?")
.setMessage("This cannot be undone!")
.setPositiveButton("DO NOT delete", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//system default is dismiss()
}
})
.setNegativeButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//delete song, then update title list
getApplicationContext().deleteFile(songListArray.get(position));
songListArray.remove(position);
updateSharedPref(titlePref, TITLE_PREF, songListArray);
mSetListAdapter(songListArray);
Toast.makeText(
getApplicationContext(),
"Deleted",
Toast.LENGTH_SHORT).show();
}
});
confirmDel.create().show();
return true;
}
});
}
@Override
protected void onListItemClick (ListView l, View v, int position, long id){
//return selected song to main activity so it can be loaded into text box's
Intent resultIntent = new Intent(EXTRA_NAME, Uri.parse(songListArray.get(position)));
setResult(RESULT_OK, resultIntent);
finish();
}
private void mSetListAdapter(ArrayList<String> list) {
final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(
this,
android.R.layout.simple_list_item_1,
list
);
setListAdapter(arrayAdapter);
}
private void updateSharedPref(SharedPreferences sharedPref,
String prefFileName,
ArrayList<String> list) {
SharedPreferences.Editor editor = sharedPref.edit();
try {
editor.putString(prefFileName, ObjectSerializer.serialize(list));
} catch (IOException e) {
e.printStackTrace();
}
editor.apply();
}
追加: 以下は、ランダムに選択されたユーザーからの 1 つのエラー インスタンスです。
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null,
request=0, result=-1, data=Intent { act=com.my.app.NAME
dat=Scrivo una Canzone }} to activity
{com.my.app/com.my.app.ActivityONE}:
java.lang.NullPointerException: Attempt to invoke virtual method 'void
java.io.BufferedReader.close()' on a null object reference
at android.app.ActivityThread.deliverResults(ActivityThread.java:3633)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3676)
at android.app.ActivityThread.access$1300(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1358)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5351)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
... 10 more