从其他活动

时间:2017-01-14 18:37:27

标签: android listview

我在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中来回传递列表,但如果我必须这样做,那就没关系。

如何确保在活动之间维护列表?

2 个答案:

答案 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();

要记住从不在单例类中存储上下文,因为它会导致内存泄漏。