1

配列リストを保存Stringし、それを使用してシリアル化し、ObjectSerializerそのシリアル化されたリストをSharedPreferencesインスタンスに保存するアプリケーションがあります。

SharePreferencesこれには、同じオブジェクトからの「配置」と「取得」の 2 つのアクティビティが含まれます。

ListActivity、アイテムを長押しして削除プロセスを開始します。削除後、更新されたオブジェクトStringで を再初期化してを更新します。もう一度呼び出して再起動すると、リストにアイテムが再び表示されます。もう存在しないオブジェクトを指しているため、クリックすると が発生します ( ) 。ListAdapterArrayList<String>ListViewListAcivityNullPointerExceptionnull

からアイテムを削除してから、 then に入れてみましArrayList<String>た。古い値を削除しようとしました(またはメソッドを使用)。ステップを見落としているだけかもしれませんが、何が原因なのかわかりません。ObjectSerializerSharedPreferencesSharedPreferenceclear()remove()

別のアクティビティから同じ (正しく更新されたリスト) オブジェクトを取得できるように、オブジェクトをシリアル化ArrayList<String>し、オブジェクトに保存しSharedPreference、リストからアイテムを削除してアイテムを更新し、オブジェクトを更新する方法を誰かに教えてもらえますか?SharedPreferenceSharedPreference

どうもありがとう!

以下は私の(短縮された)コードです:

アクティビティ 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
4

0 に答える 0