3

To Do リストを作成しています。現在、私のアプリは ListView との間でデータを追加および削除しています。ただし、アプリケーションを閉じるとデータが消去されます。SharedPreferences を使用してデータ onDestroy() を保存したいのですが、アプリを開いたときにデータをリロードする必要がありました。

ただし、このタスクを達成する方法がわかりません。 共有設定を使用して ListView を保存するのを手伝ってくれる人はいますか (別名、コードを探しています)。

アプリケーションを閉じたときに複数の文字列を動的に追加しようとしている共有設定が 1 つだけのチュートリアルがあります。その後、再度開くとデータが表示されます。私は 1 つのアクティビティ ページのみを使用しています。すべてが 1 つのページで発生します。

ここに私のコードがあります:

public class Main_ToDoList extends Activity implements OnClickListener
{
private Button btnAdd;
private EditText et;
private ListView lv;
ArrayList<String> list = new ArrayList<String>();
ArrayAdapter<String> adapter;
final Context context = this;

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_activity);

    btnAdd = (Button)findViewById(R.id.addTaskBtn);
    btnAdd.setOnClickListener(this);
    et = (EditText)findViewById(R.id.editText);
    adapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, list);

    // set the lv variable to your list in the xml
    lv=(ListView)findViewById(R.id.list);
    lv.setAdapter(adapter);

    // set ListView item listener
    lv.setOnItemClickListener(new AdapterView.OnItemClickListener()
    {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, final int position, long id)
        {
            AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);
            alertDialogBuilder.setTitle("Confirm Delete");
            alertDialogBuilder.setMessage("Sure you want to delete?");
            alertDialogBuilder.setCancelable(false);
            alertDialogBuilder.setPositiveButton("Yes", new DialogInterface.OnClickListener()
            {
                @Override
                public void onClick(DialogInterface dialogInterface, int i)
                {
                    adapter.remove(adapter.getItem(position));
                }
            });
            alertDialogBuilder.setNegativeButton("No", new DialogInterface.OnClickListener()
            {
                @Override
                public void onClick(DialogInterface dialogInterface, int i)
                {
                    dialogInterface.cancel();
                }
            });
            AlertDialog alertDialog = alertDialogBuilder.create();
            alertDialog.show();
        }
    });
}
public void onClick(View v)
{
    String input = et.getText().toString();
    if(input.length() > 0)
    {
        adapter.add(input);
        et.setText("");
    }
}
@Override
public void onDestroy()
{
    super.onDestroy();
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main__to_do_list, menu);
    return true;
}
} 
4

3 に答える 3

3

Android SharedPreferences は、単一のキーと値のペアのデータを格納するために使用されます。つまり、反復的で複雑なデータを格納するようには作られていません。あなたの場合、アプリによっては、リストビューに100行以上が含まれる場合があります。行ごとに SharedPreferences オブジェクトを作成すると、100 個以上になり、まったく効率的ではありません。これに対する解決策は、上記で提案したとおり、Android の SQLite データベースを使用することです。

良いチュートリアル: http://www.androidhive.info/2011/11/android-sqlite-database-tutorial/

于 2014-03-04T16:36:06.123 に答える
1

私はそれが古いことを知っていますが、それでもshareprefを使用してこの投稿を見たい人のために私のソリューションを共有したいと思います.

1) ArrayAdapter を拡張するカスタム クラスを作成し、toString メソッドをオーバーライドします。すべての行の間に「,」を追加して配置するだけです。

public class GroceryArrayAdapter extends ArrayAdapter<String> {
    public GroceryArrayAdapter(Context context, int resource) {
        super(context, resource);
    }

    public GroceryArrayAdapter(Context context, int resource, int          textViewResourceId) {
        super(context, resource, textViewResourceId);
    }

    public GroceryArrayAdapter(Context context, int resource, int     textViewResourceId, String[] objects) {
        super(context, resource, textViewResourceId, objects);
    }

    public GroceryArrayAdapter(Context context, int resource, String[]     objects) {
        super(context, resource, objects);
    }

    public GroceryArrayAdapter(Context context, int resource, List<String> objects) {
        super(context, resource, objects);
    }

    public GroceryArrayAdapter(Context context, int resource, int     textViewResourceId, List<String> objects) {
        super(context, resource, textViewResourceId, objects);
    }

    @Override
    public String toString(){
        String data = "";
        for (int i = 0; i < getCount(); i++) {
            data += getItem(i).toString() ;
            if( i + 1 < getCount()){
                data += ",";
            }
        }
        return  data;
    }
}

2) データを 1 つの文字列として保存します。onPause() に入れる

    private void saveData(){
        sharedPrefs = activity.getSharedPreferences(Constants.APPSharePref,
                Context.MODE_PRIVATE);
        SharedPreferences.Editor e = sharedPrefs.edit();
        e.putString(Constants.GROCERY,**grocery_adapter.toString()**);
        e.commit();
    }

3) onResume で、文字列を「,」で連結してデータを復元し、それをアダプタに追加します。

    private void loadDataFromPref(){
        sharedPrefs = getActivity().getSharedPreferences(Constants.APPSharePref,
            Context.MODE_PRIVATE);

        String gList =sharedPrefs.getString(Constants.GROCERY,"");
        if(!"".equals(gList) && ""!=gList){
            String [] str = gList.split(",");
            for (String item : str) {
                grocery_adapter.add(item);
            }
        }
    }
于 2015-05-22T00:32:26.960 に答える