0

我需要存储我通过“添加”按钮动态创建的列表视图。当然,现在如果我退出应用程序,这些项目就会消失。我以这种方式尝试过,但出了点问题

public class MainActivity extends Activity{
    private EditText etInput;
    private Button btnAdd;
    private ListView lvItem;
    private ArrayList<String> itemArrey;
    private ArrayAdapter<String> itemAdapter;

    /* Called when the activity is first created. */

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        setUpView();

        // Eliminare un elemento al longClick con dialog di conferma
        lvItem.setOnItemLongClickListener(new OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View v,
                    final int position, long id) {
                // TODO Auto-generated method stub
                    AlertDialog.Builder adb = new AlertDialog.Builder(
                    MainActivity.this);
                    adb.setTitle("Are you sure");
                    adb.setPositiveButton("Yes",
                        new DialogInterface.OnClickListener() {

                            @Override
                            public void onClick(DialogInterface dialog,
                                    int which) {
                                // TODO Auto-generated method stub
                                itemArrey.remove(position);
                                itemAdapter.notifyDataSetChanged();

                            }
                        });
                adb.setNegativeButton("No",
                        new DialogInterface.OnClickListener() {

                            @Override
                            public void onClick(DialogInterface dialog,
                                    int which) {
                                // TODO Auto-generated method stub
                                 dialog.dismiss();

                            }
                        });
                adb.show();

                return false;
            }
        });

        lvItem.setClickable(true);
        lvItem.setOnItemClickListener(new AdapterView.OnItemClickListener() {

          @Override
          public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {

            Object o = lvItem.getItemAtPosition(position);
            Intent intent2 = new Intent(getApplicationContext(), MainActivity.class); // Mettere settings.class quando creata
            MainActivity.this.startActivity(intent2); 
          }
        });
    }

    private void setUpView() {
        etInput = (EditText)this.findViewById(R.id.editText_input);
        btnAdd = (Button)this.findViewById(R.id.button_add);
        lvItem = (ListView)this.findViewById(R.id.listView_items);


        itemArrey = new ArrayList<String>();
        itemArrey.clear();

        itemAdapter = new ArrayAdapter<String>(this, R.layout.customlistview,itemArrey);
        lvItem.setAdapter(itemAdapter);


        btnAdd.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

                addItemList();
            }
        });  

    }

    protected void addItemList() {

    if (isInputValid(etInput)) {
        itemArrey.add(0,etInput.getText().toString());
        etInput.setText("");

        itemAdapter.notifyDataSetChanged();

    }   

    }

    protected boolean isInputValid(EditText etInput2) {
        // TODO Auto-generatd method stub
        if (etInput2.getText().toString().trim().length()<1) {
            etInput2.setError("Insert value");
            return false;
        } else {
            return true;
        }

    }
    // Shared preferences
    protected void SavePreferences(String key, String value) {
        // TODO Auto-generated method stub
        SharedPreferences data = PreferenceManager.getDefaultSharedPreferences(this);
        SharedPreferences.Editor editor = data.edit();
        editor.putString(key, value);
        editor.commit();


    }
    protected void LoadPreferences(){
        SharedPreferences data = PreferenceManager.getDefaultSharedPreferences(this);
        String dataSet = data.getString("LISTS", "None Available");

         itemAdapter.add(dataSet);
         itemAdapter.notifyDataSetChanged();
    }

我不知道如何“调用”共享偏好,也不知道这样是否正确。现在什么都没有发生,什么都没有保存。有人可以帮助我吗?谢谢

4

2 回答 2

1

现在什么都没有发生,什么都没有保存。

那是因为你从不调用你的SavePreferences()方法。

如果您想继续使用SharedPreferences将数据存储在列表中,则需要调用SavePreferences()列表中的每个项目。

但是,SharedPreferences用于以键值格式存储数据。这意味着列表中的每个项目都需要一个密钥,并且您需要知道该密钥才能检索数据。如果您的列表可以包含可变数量的项目,SharedPreferences则可能不是您想要的。

我建议阅读Storage Options文档,该文档提供了Shared Preferences正确使用的完整示例,并讨论了可能更适合您需求的其他选项。

于 2013-10-10T18:09:54.880 回答
1

您应该查看有关活动生命周期的 API 培训:

http://developer.android.com/training/basics/activity-lifecycle/index.html

还有这个:

http://developer.android.com/training/basics/activity-lifecycle/recreating.html

如您所见,您的活动可能会消失,因为用户主动销毁它(使用后退按钮)或系统可以销毁它。如果他们系统销毁它,您可以使用 onSaveInstanceState 保存数据并使用 onCreate 检索它。在这种情况下,您不必使用 SharedPreferences - 只需按照链接中的说明使用 Bundle。

但是,如果您想在用户关闭数据时保留数据,则应在调用回调 onDestroy() 时保存数据。并在调用 onCreate() 时检索数据。在系统认为不再需要您的活动之前调用 onDestroy(),例如当用户单击“返回”按钮时。在这种情况下,您必须使用 android 提供的一种存储方法,包括共享首选项。就像其他人说的那样,它需要一个“键、值”机制,因此它可能无法与您所做的 100% 匹配。对于此任务,使用 sqlLite 有点重,因为您的数据也不是真正的表类型(实际上是单列表,它仍然不是数据库值得 IMO)。我认为存储列表的最佳方法是使用内部文件。当 onDestroy() 被调用时,获取所有数据并保存到文件中。调用 onCreate() 时,读取文件并重新填充您的列表。您可以在此处阅读有关 android 文件系统的信息,包括内部文件:

http://developer.android.com/training/basics/data-storage/files.html

作为关闭说明,如果用户按下“主页”按钮,您的活动将不会被破坏。如果他随后“强制关闭”您的应用程序,则不会保存任何内容。如果即使在这种情况下您仍想保存它,我建议您在调用“onStop()”时保存您的数据,并在调用 onStart() 时重置您的列表。

于 2013-10-10T18:44:59.893 回答