使用共享首选项保存和重新加载ListView [Saving onDestroy()]

时间:2013-09-09 17:02:31

标签: android listview android-listview save

我正在创建待办事项列表。现在我的应用程序在ListView中添加和删除数据。但是,当我关闭我的应用程序时,数据将被删除。我想使用SharedPreferences来保存数据onDestroy(),然后当我的应用程序打开时,我想要重新加载数据。

但是,我不知道如何完成这项任务。 任何人都可以帮我保存使用共享首选项的ListView(我也在寻找代码)?

只有一个共享首选项的教程我希望在我的应用程序关闭时动态添加多个字符串。然后,当我重新打开它时,数据将出现。我只使用ONE ACTIVITY页面,一切都会在一页上发生。

这是我的代码:

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;
}
} 

3 个答案:

答案 0 :(得分:5)

作为suggested by Stefano Munarini,您可以使用数据库。

另一方面,您可以遍历ArrayAdapter的元素(包装ArrayList)并将它们存储到SharedPreferences中,如下所示:

public static final String PREFERENCES_TODO = "TODO_List_Shared_Preferences";
// ...
SharedPreferences prefs = context.getSharedPreferences(PREFERENCES_TODO,
                                                       MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
// This will remove all entries of the specific SharedPreferences
editor.clear();
for (int i = 0; i < adapter.getCount(); ++i){
    // This assumes you only have the list items in the SharedPreferences.
    editor.putString(String.valueOf(i), adapter.getItem(i));
}
editor.commit();
// ...
// And the reverse process:
SharedPreferences prefs = context.getSharedPreferences(PREFERENCES_TODO,
                                                       MODE_PRIVATE);
for (int i = 0;; ++i){
    final String str = prefs.getString(Integer.valueOf(i), "");
    if (!str.equals("")){
        adapter.add(str);
    } else {
        break; // Empty String means the default value was returned.
    }
}

一些注意事项:

  • 在onPause()中保存SharedPreferences,而不是在不保证调用的onDestroy()中保存。请参阅Activity Lifecycle以供参考。
  • 禁止用户输入空字符串。 (编辑:你已经这样做了。)
  • 如果您知道不会有2个相同的字符串(禁止或其他),您可以使用SharedPreferences.Editor.putStringSet(String, Set<String>)来使用单个条目。
  • 如果有很多元素或者您计划添加额外的选项(即截止日期,类别等),您应该考虑数据库选项,因为SharedPreferences解决方案不能提供良好的可伸缩性。

答案 1 :(得分:2)

Android SharedPreferences用于存储单个键值配对数据。换句话说,它不是存储重复和复杂的数据。在您的情况下,列表视图可能包含100行或更多行取决于您的应用程序。如果你要为每一行创建一个SharedPreferences对象,它将是100多个,这根本就没有效率。对此的解决方案如上所述,是使用Android的SQLite数据库。

一个好的教程:http://www.androidhive.info/2011/11/android-sqlite-database-tutorial/

答案 2 :(得分:1)

我知道它已经过时了,但我想与那些仍想使用sharepref的人分享我的解决方案并查看此帖子。

1)创建扩展ArrayAdapter并覆盖toString方法的自定义类。只需追加并放置&#39;,&#39;在每一行之间。

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)将数据保存为一个字符串。把它放在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中通过使用&#39;,#39;来固定字符串来恢复数据。并将其添加到适配器。

    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);
            }
        }
    }