我在ShoppingListActivity中有一个项目列表视图。
项目是从另一个被认为是意图的活动中添加的。我希望确保在两个活动之间将所有项目保留在列表中;但是,现在我的列表只有从上一个活动中添加的最后一个项目。
我的ShoppingListActivity.class
public class ShoppingListActivity extends Activity {
private ListView mainListView ;
private ArrayAdapter<String> listAdapter ;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_shopping_list);
// Find the ListView resource.
mainListView = (ListView) findViewById( R.id.mainListView );
ArrayList<String> shoppingList = new ArrayList<String>();
shoppingList.add(itemLookup());
// Create ArrayAdapter using the shopping list.
listAdapter = new ArrayAdapter<String>(this, R.layout.simplerow, shoppingList);
// Set the ArrayAdapter as the ListView's adapter.
mainListView.setAdapter( listAdapter );
}
//Lookup item by ID
public String itemLookup() {
String itemName = "";
Intent intent = getIntent();
Bundle extras = intent.getExtras();
if (intent != null) {
String itemId = extras.getString("BARCODE_ID");
try {
itemName = ItemLookup.lookupById(itemId);
} catch (IOException e) {
e.printStackTrace();
}
}
return itemName;
}
@Override
public void onBackPressed() {
startActivity(new Intent(ShoppingListActivity.this, MainActivity.class));
}
}
我有一种感觉,我应该把我的add
放在其他地方。我很确定我应该在putExtra
中来回传递列表,但如果我必须这样做,那就没关系。
如何确保在活动之间维护列表?
答案 0 :(得分:1)
将数据结构保存在活动中会使您的应用容易丢失数据,因为活动可能会因各种原因而被破坏,包括在纵向和横向之间旋转设备。
您应该使用单独的类来存储和跟踪购物清单中的哪些商品。具有ListView的Activity应该只获取存储的项目列表并显示它们。导致项目添加的任何内容都应该只是触发重新加载列表(如果活动在前台运行),否则活动应该在下次启动时看到新项目。
如果您还需要在流程终止后保持数据的持久性,那么您应该查看可用的data storage options。
答案 1 :(得分:1)
解决问题的方法之一是Singleton Pattern。
在您的情况下,您可以实现以下内容:
public class ShoppingListManager {
private static ShoppingListManager instance = new ShoppingListManager();
private List<String> shoppingList;
public static ShoppingListManager getInstance() {
return instance;
}
public List<String> getShoppingList() {
return shoppingList;
}
// Make the constructor private so that this class cannot be instantiated
private ShoppingListManager(){
shoppingList = new ArrayList<String>();
}
}
然后在代码中的任意位置访问它。
ShoppingListManager.getInstance().getShoppingList();
要记住从不在单例类中存储上下文,因为它会导致内存泄漏。