繁体   English   中英

如何在Java中将数据存储在ArrayList中

[英]How to store data in an ArrayList in Java

我正在构建一个Android应用程序,但遇到了ArrayList问题。 我使用它来存储字符串,然后将这些字符串放入列表中。 我可以轻松地将新项目添加到ArrayList中,但是如果我转到一个新活动并返回到此列表,则这些项目都消失了。 我该如何阻止这种情况发生?

这是MainListActivity:

public class MainListActivity extends FragmentActivity implements NewListItemDialog.NewListItemDialogListener {

List<String> mListItems = new ArrayList<String>();

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

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
             android.R.layout.simple_list_item_1, mListItems);
    ListView lv = (ListView) findViewById(android.R.id.list);
    lv.setAdapter(adapter); 

    lv.setOnItemClickListener(new OnItemClickListener() {
          @Override
          public void onItemClick(AdapterView<?> parent, View view,
            int position, long id) {
              Intent matrixIntent = new Intent(getApplicationContext(), MatrixDetailActivity.class);
              startActivity(matrixIntent);
          }
        });
}

@Override
public void onDialogPositiveClick(DialogFragment dialog) {

    Dialog dialogView = ((DialogFragment) dialog).getDialog();
    EditText newListItemName = (EditText) dialogView.findViewById(R.id.newListItemName);
    mListItems.add(newListItemName.getText().toString());
    Toast.makeText(this, newListItemName.getText().toString() + " has been added", Toast.LENGTH_LONG).show();
    dialog.dismiss();

}

@Override
public void onDialogNegativeClick(DialogFragment dialog) {        

}

@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_list, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // TODO Auto-generated method stub
    switch (item.getItemId()) {
    case R.id.new_list_item:
        showNewListItemDialog();
        break;
    }
    return true;
}

public void showNewListItemDialog() {
    FragmentManager fm = getSupportFragmentManager();
    NewListItemDialog newListItemDialog = new NewListItemDialog();
    newListItemDialog.show(fm, "NewListItemDialog");
}

}

谢谢,约翰

一种方法是使用SharedPreferences存储数组。

  1. 在您的MainActivity类中,声明用于首选项的文件:

     public static final String PREF_FILE = "preferences"; 
  2. 覆盖onPause(),我们将在其中保存ArrayList:

     @Override protected void onPause() { super.onPause(); //create preferences and get editor, so that we can insert and save our array SharedPreferences preferences = getSharedPreferences(PREF_FILE, MODE_PRIVATE); SharedPreferences.Editor editor = preferences.edit(); //convert ArrayList to set so that it can be stored //NOTE: putStringSet() was added in API 11 Set<String> stringSet = new HashSet<String>(list); //place the set under the key 'mylist' editor.putStringSet("mylist", stringSet); //save it editor.commit(); } 
  3. 覆盖onResume(),并恢复列表:

     @Override protected void onResume() { super.onResume(); SharedPreferences preferences = getSharedPreferences(PREF_FILE, MODE_PRIVATE); //get saved set, set to null if no set present Set<String> set = preferences.getStringSet("mylist", null); //if set is != null recreate ArrayList and assign to list variable //set will be null on first run, because onPause() have not yet been called //to save the array, hence we need to do this check if (set != null) { list = new ArrayList<String>(set); } } 

需要记住的几件事:

  • 此解决方案要求您使用API​​ 11+(在API 11中添加了putStringSet())
  • 集合中没有重复项,因此请考虑到这一点

在您的活动中重写saveInstanceState(bundle)方法,并将其保存为捆绑包,然后从onCreate(bundle)接收它。 系统将传递onCreate()的参数包,其中包含您在saveinstanceState()方法中保存的内容。

您始终可以使用Singleton来保存交叉活动数据,而不会弄乱Activity的生命周期。

我时不时地这样做,而没有性能问题或缺点,我发现更优雅,更不容易出错,这使该活动的不同onXXX方法变得容易。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM