web-dev-qa-db-ja.com

IntentフラグメントのSerializable ArrayListを取得する

私のフラグメントでは、_ArrayList<Animal>_を取得します。 newInstance関数を作成しました。

_  companion object {
    private val ARG_TITLE = "ARG_TITLE"
    private val ARG_ANIMALS = "ARG_ANIMALS"

    fun newInstance(title: String,animals: ArrayList<Animal>): ExampleFragment{
        val fragment = ExampleFragment()
        val args = Bundle()
        args.putString(ARG_TITLE, title)
        args.putSerializable(ARG_ANIMALS, animals)
        fragment.arguments = args
        return fragment
    }
}
_

そして私のonCreate()にはこれがあります。

_ private var title: String = ""
lateinit private var animals:ArrayList<Animal>

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    if (arguments != null) {
        title = arguments.getString(ARG_TITLE)
        animals = arguments.getSerializable(ARG_ANIMALS)
    }
}
_

だが

必須:シリアライズされたArrayListが見つかりました!

ArrayListにもキャストできません。

14
Aris Guimerá

コメントで述べたように、それをキャストします:

注:ArrayListの場合、Serializableへのキャストは不要です(つまり、ArrayList-ListとMutableListは異なる影響を受けます)。 ListおよびMutableListはSerializableにキャストする必要があります(そうしないと、「互換性のないタイプ」エラーが表示されます)

args.putSerializable(ARG_ANIMALS, animals as Serializable) //This is to cast it to the appropriate form in order for it to be serialized properly

そしてそれを出力にミラーリングします:

ここでのキャストは、何があっても必要です。それ以外の場合は、シリアライズ可能なクラスではなく、シリアライズ可能なクラスを取得します。

animals = arguments.getSerializable(ARG_ANIMALS) as ArrayList<Animal>

タイプはひし形で指定する必要があります。指定しないと、animals: ArrayList<Animal>ArrayList<*>と一致しないためにエラーが発生します。

ただし、どのタイプを受け入れるかを一般化するために、ArrayListではなくListの使用を検討することもできます(インスタンスのMutableListを含めます)。

そして、これは、AnimalがSerializableを実装している場合にのみ機能します。そうしないと、バンドルからリストを配置/取得するとクラッシュします。リストは、それらのクラスもそうである場合にのみシリアライズ可能です。

20
Zoe

インテントフラグメントのArrayListの取得は、次のコード行で行われます。また、このコードは、オブジェクト型のSerializableおよびNon-Serializable ArrayListの両方で機能します。

//first add this dependency in app build.gradle file
compile 'com.google.code.gson:gson:2.8.0'


//to send the arraylist contains elements of object type.
ArrayList<Object> mOrderList=new ArrayList();
//suppose this list now contains some data like number of objects.
Fragment fragment new YourFragment();
Bundle bundle=new Bundle();
Gson gson = new Gson();
String jsonDetails = gson.toJson(mOrderList);
bundle.putString(IntentKeyConstants.TAG_ORDER_LIST, jsonDetails);
fragment.setArguments(bundle);
FragmentTransaction fragmentTransaction=getActivity().getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.main_frame, fragment, CURRENT_TAG);
fragmentTransaction.addToBackStack(CURRENT_TAG);
fragmentTransaction.commit();


//to get the arraylist contains the element of object type in fragment
ArrayList<Object> mOrderList=new ArrayList();
Gson gson=new Gson();
String jsonDetails;  
jsonDetails=getArguments().getString(IntentKeyConstants.TAG_ORDER_LIST);
Type type=new TypeToken<ArrayList<SuggestionResponseBean>>(){}.getType();
mOrderList=gson.fromJson(jsonDetails,type);

このソリューションがお役に立てば幸いです。ありがとう

1
Aman Goyal

動物クラスにSerializableを実装させ、以下のコードを使用してバンドルにデータを設定する必要があります

args.putSerializable(ARG_ANIMALS, animals)

以下のように別のフラグメントでデータを取得するには

animals = arguments.getSerializable(ARG_ANIMALS)
0
Shivam Sharma