簡體   English   中英

Android如何在活動之間傳遞LinkedHashMap?

[英]Android How to Pass LinkedHashMap Between Activities?

我試圖在活動之間傳遞LinkedHashMap,我的代碼是這樣的

活動A.

LinkedHashMap mLinkedHashMap = new LinkedHashMap<String, Object>();
// setting data in map
Bundle bundle = new Bundle();
bundle.putSerializable("OBJECTS_LINKED_HASHMAP", mLinkedHashMap);  
Intent intent = new Intent(this, ActivityB.class); 
intent.putExtras(bundle);
startActivity(intent);

在Activity中,當我收到bundle對象時,我收到“Class cast exception”錯誤消息

活動B.

Bundle bundle = this.getIntent().getExtras();
LinkedHashMap mLinkedHashMap = new LinkedHashMap<String, Object>();
mLinkedHashMap = (LinkedHashMap<String, Object>) bundle.getSerializable("OBJECTS_LINKED_HASHMAP");

獲得類強制轉換異常

ClassCastException: java.util.HashMap cannot be cast to LinkedHashMap

我檢查了文檔LinkedHashMap也實現了Serializable接口。

我正在使用LinkedHashMap,因為我想維護對象順序,他們按順序插入我想要的方式。

如何在活動之間傳遞LinkedHashMap?

嘗試GSON進行更改:)

從此鏈接下載gson.jar

並在您的項目中添加gson-2.2.2.jar文件。
現在使用GSON將LinkedHashMap傳遞給另一個活動

像這樣(根據你的需要修改下面的代碼):

主要活動:::

public class MainActivity extends Activity {
    ObjectClass obj=new ObjectClass();
    LinkedHashMap<String, ObjectClass> mLinkedHashMap = new LinkedHashMap<String, ObjectClass>();
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        obj.id=1;
        obj.name="hello";

        mLinkedHashMap.put("test", obj);

        Gson gson = new Gson();
        String list = gson.toJson(mLinkedHashMap); 
        Intent intent = new Intent(this, secondActivity.class); 
        intent.putExtra("list", list);
        startActivity(intent);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}

secondActivity :::

public class secondActivity extends Activity {
    LinkedHashMap<String, ObjectClass> mLinkedHashMap = new LinkedHashMap<String, ObjectClass>();
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
     String str=  getIntent().getStringExtra("list");
     Gson gson = new Gson();

     Type entityType = new TypeToken< LinkedHashMap<String, ObjectClass>>(){}.getType();
     mLinkedHashMap = gson.fromJson(str, entityType);
    ObjectClass obj = mLinkedHashMap.get("test");

     Log.i("list", ""+obj.id);
    }
}

為我工作。 希望這會有所幫助。

這是我的對象類供參考。

public class ObjectClass {

    public int id;
    public String name;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }


}

如何添加gson-2.2.2.jar文件。

1)從下載的文件夾“google-gson-2.2.2”復制你的gson-2.2.2.jar。
2)將其粘貼到項目的資產文件夾中。
3)現在通過右鍵單擊項目>構建路徑>配置構建路徑轉到項目構建路徑。
4)它將打開一個對話框,從右側菜單中選擇java build path然后轉到library tag
點擊“Add Jars ...”按鈕,如下圖所示
它將打開另一個添加jar的對話框。 這里選擇我們在項目資產文件夾中添加的gson-2.2.2.jar(步驟2)。
它會將jar添加到你的項目中(我已將它添加到我的項目中,如下圖所示)

在此輸入圖像描述 5)現在選擇Order and Export標簽並選擇你的gson-2.2.2.jar(見下圖)。
在此輸入圖像描述 6)按OK,現在您可以在項目中使用GSON

LinkedHashMap <>不是Parcelable或Serializable

編輯:

檢查一下:

序列化/反序列化LinkedHashMap(android)java

編輯:

根據Manish Android提供的鏈接,解決方案是

  if (getIntent().getSerializableExtra("OBJECTS_LINKED_HASHMAP") != null)
                HashMap<?, ?>   user_info = (HashMap<?, ?>) getIntent().getSerializableExtra("OBJECTS_LINKED_HASHMAP");


    LinkedHashMap<String, Object>   userdata= (LinkedHashMap<String, Object>) user_info

你需要得到這樣的

if (getIntent().getSerializableExtra("OBJECTS_LINKED_HASHMAP") != null)
        LinkedHashMap<String, Object>   user_info = (LinkedHashMap<String, Object>) getIntent().getSerializableExtra("OBJECTS_LINKED_HASHMAP");

傳遞為字節數組,然后反序列化並LinkedHashMap為目標Activity中的LinkedHashMap

我的方法如下:

CustomObject必須實現Parcelable。 要設置捆綁包:

    LinkedHashMap<Integer, List<CustomObject>> mItems

    Bundle bundle = new Bundle();

    bundle.putInt("ItemsSize",mItems.size());          
    int mapIndex=0;

for(Map.Entry<Integer, List<CustomObject>> entry : mItems.entrySet()) {
    int key = entry.getKey();
    bundle.putInt("Key"+mapIndex, key);
    bundle.putParcelableArrayList("Value"+mapIndex, mItems.get(key));
    mapIndex++;
}

要獲得捆綁:

for(int i=0;i<bundle.getInt("ItemsSize");i++) {
    int key = bundle.getInt("Key"+i);
    ArrayList<CustomObject> value = bundle.getParcelableArrayList("Value"+i);
    mItems.put(key, value);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM