16

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);

バンドルオブジェクトを受け取ったときのアクティビティで、「クラスキャスト例外」エラーメッセージが表示されます

アクティビティ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をアクティビティ間で渡す方法は?

4

5 に答える 5

22

変更してみ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ビルドパスを選択して1つのダイアログを開き、ライブラリタグに移動して
[ジャーの追加]をクリックします。下の画像にあるように、ボタンをクリックする
と、jarを追加するための別のダイアログが開きます。ここで、プロジェクトのアセットフォルダーに追加したgson-2.2.2.jarを選択します(ステップ2)。
プロジェクトにjarが追加されます(下の画像でわかるように、すでにプロジェクトに追加しています)

ここに画像の説明を入力してください 5)次に、[注文とエクスポート]タグを選択し、gson-2.2.2.jarを選択します(下の画像を参照)。
ここに画像の説明を入力してくださいGSON

于 2013-02-16T07:33:09.977 に答える
4

LinkedHashMap<>はパーセル可能またはシリアル化可能ではありません

編集 :

これをチェックして :

LinkedHashMap(android)javaをシリアル化/逆シリアル化

于 2013-02-16T06:08:03.560 に答える
3

編集:

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");
于 2013-02-16T06:09:08.523 に答える
0

バイト配列として渡し、逆シリアル化し LinkedHashMapてターゲットアクティビティにキャストします。

于 2015-11-26T17:33:33.133 に答える
0

私のアプローチは次のとおりです。

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);
}
于 2018-04-22T23:34:18.253 に答える