0

aがロードされると、通常は機能するカスタム リスト アダプターlistfragmentをロードするアプリがありますが、アプリを閉じて再度開いてもオブジェクトが常に保持されるように、オブジェクト ストレージを実装しようとしています。ユーザーが手動で削除した場合にのみ削除されます。

私はここでそれを実装しようとしていますが、この方法では、listfragmentがロードされると、画面の中央に「ロード中のアイコン」が消えません。ログ出力から、try ブロックが入力されていないことが原因であることがわかりました。その直前のコードは入力されていますが、try ブロック内のコードは入力されていません。なぜでしょうか?

public class MainListFragment extends ListFragment{ 
    OnListSelectedListener mCallback;
    public ObjectStorage mainObjectList = new ObjectStorage();  //creates the list of objects
    SharedPreferences mPrefs;
    int mCurrentPosition = -1;


    // The container Activity must implement this interface so the frag can deliver messages
    public interface OnListSelectedListener {
        /** Called by ListFragment when a list item is selected */
        public void onItemSelected(int position, String schedulename, String[] ampm, boolean[] days, int[] times, boolean vibrate);
    }


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }


    @Override
    public void onStart() {
        super.onStart();

        updateStorage();
        ByteArrayInputStream byteArray = new ByteArrayInputStream(mPrefs.getString("myobject", "").getBytes());
        ObjectInputStream in;
        try {
            in = new ObjectInputStream(byteArray);
            ObjectStorage updatedStorageList = (ObjectStorage) in.readObject();
            CustomListAdapter adapter = new CustomListAdapter(getActivity(), 
                    R.layout.listview_item_row, updatedStorageList);
            //setListAdapter(new ArrayAdapter<String>(getActivity(), layout, arraylist));
            setListAdapter(adapter);
        } catch (StreamCorruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


    }

    public void updateStorage()
    {
        getActivity();//used for MODE_PRIVATE

        //store object list into android system
        mPrefs = getActivity().getPreferences(Context.MODE_PRIVATE);
        SharedPreferences.Editor ed = mPrefs.edit();
        ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream(); 
        ObjectOutputStream out;
        try {
            out = new ObjectOutputStream(arrayOutputStream);
            out.writeObject(mainObjectList);
            out.close();
            arrayOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        ed.putString("myobject", arrayOutputStream.toString());
        ed.commit();
    }

}
4

1 に答える 1

0

setListAdapter が try catch ブロック内にあり、例外が発生した場合、setListAdapter はフラグメントへのバインドを実行しません。空のリストを使用して、try catch ブロックの外側で setListAdapter を呼び出すことができます。その後、try catch メソッド内でオブジェクトを手動で追加できます。

@Override
    public void onStart() {
        super.onStart();
        ObjectStorage emptyList = new ObjectStorage(); // or some like new ArrayList<Object>();
        CustomListAdapter adapter = new CustomListAdapter(getActivity(), 
            R.layout.listview_item_row, emptyList);
setListAdapter(adapter);
    updateStorage();
    ByteArrayInputStream byteArray = new ByteArrayInputStream(mPrefs.getString("myobject", "").getBytes());
    ObjectInputStream in;
    try {
        in = new ObjectInputStream(byteArray);
        ObjectStorage updatedStorageList = (ObjectStorage) in.readObject();

        //setListAdapter(new ArrayAdapter<String>(getActivity(), layout, arraylist));
        adapter.addAll(updatedStorageList);
        adapter.notifyDataSetChanged();
    } catch (StreamCorruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


}
于 2013-03-02T05:59:14.360 に答える