今天在寫一個方法的時候需要構造一個 List 包含一組 HashMap 的情況 ,和這個問題類似
How to add HashMap to ArrayList
ArrayList<HashMap<String, String>> prodArrayList = new ArrayList<HashMap<String, String>>();
HashMap<String, String> prodHashMap = new HashMap<String, String>();
public void addProd(View ap)
{
// test arraylist of hashmaps
prodHashMap.put("prod", tvProd.getText().toString());
prodArrayList.add(prodHashMap);
tvProd.setText("");
// check data ///
Log.e("myLog","Data prodArrayList in ADD Method Size = "+prodArrayList.size());
for(int i=0; i< prodArrayList.size();i++)
{
Log.e("myLog","Data prodArrayList in ADD Method = "+prodArrayList.get(i).toString());
}
}
具體情況可以點進去看下 ,會出現這個問題的原因是 HashMap 添加到 List 中的時候實際上只是一個引用 ,而每次更新 HashMap 時使用的 Key 又相同的情況下會出現所有的 HashMap 實際上引用的是同一個 HashMap ,且值只有一個 。
問題找到了 ,解決問題的方法就有了 ,有這兩種方法來避免這個問題 。
public void addProd(View ap)
{
// test arraylist of hashmaps
HashMap<String, String> prodHashMap = new HashMap<String, String>();
prodHashMap.put("prod", tvProd.getText().toString());
prodArrayList.add(prodHashMap);
tvProd.setText("");
// check data ///
Log.e("myLog","Data prodArrayList in ADD Method Size = "+prodArrayList.size());
for(int i=0; i< prodArrayList.size();i++)
{
Log.e("myLog","Data prodArrayList in ADD Method = "+prodArrayList.get(i).toString());
}
}
一是 每次更新 HashMap 時使用不同的 key ,這樣 List 只需要引用一個 HashMap 即可 。
二是 在每一次都新建一個 HashMap 來保存數據,之後再將 HashMap 添加到 List 中 ,避免使用 List.add 的時候改變了數據 ,就可以避免這個問題了。