如何将带有ArrayList的bundle从Fragment传递给Activity

时间:2018-05-24 02:52:25

标签: java android android-fragments android-activity

我有一个ListFragment,它实现了一个点击监听器,将点击的对象传递给IngredientActivity。当我在IngredientActivity中检索对象时,对象的变量为空。

public class ListFragment extends Fragment implements ListRecipeAdapter.ListItemClickListener {
....
@Override
    public void onListItemClick(Recipe selectedRecipe) {
        Bundle bundle = new Bundle();
        ArrayList<Recipe> selectedRecipeArray = new ArrayList<>();
        selectedRecipeArray.add(selectedRecipe);
        bundle.putParcelableArrayList("recipe",selectedRecipeArray);
        Intent intent = new Intent(getActivity(), IngredientActivity.class);
        intent.putExtras(bundle);
        startActivity(intent);
    }
}

我检索包并将对象的Arraylist提取为:

public class IngredientActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ....
        Bundle bundle = getIntent().getExtras();
        ArrayList<Recipe> recipes = bundle.getParcelableArrayList("recipe");
        recipe = recipes.get(0);

    }
}

监听器是接口:

public interface ListItemClickListener {
        void onListItemClick(Recipe recipeId);
    }

食谱被定义为Parcelable:

public class Recipe implements Parcelable {
...
}

当我在logcat中打印时:

片段中的食谱:

com.example.android.bakingapp.Models.Recipe@5d8b71e

片段中的ArrayList:

[com.example.android.bakingapp.Models.Recipe@5d8b71e]

片段中的捆绑:

Bundle[{selected_recipe=[com.example.android.bakingapp.Models.Recipe@5d8b71e]}]

检索到的对象看起来不同:

活动中的捆绑:

Bundle[mParcelledData.dataSize=6784]

活动中的ArrayList:

[com.example.android.bakingapp.Models.Recipe@1abf1e8]

活动中的食谱:

com.example.android.bakingapp.Models.Recipe@1abf1e8

4 个答案:

答案 0 :(得分:1)

您是否正确实现了Parcelable对象?

在parceled之后,您可以拥有不同的地址对象,因为使用该数据重新创建对象。

查看Recipe对象的Parcelable实现。

答案 1 :(得分:1)

您的parcelable对象看起来有问题。确保所有字段都是正确的序列化。

另一个选项 - 您的parcelable对象太大了。附加到意图的Parcelable存在大小限制 - 大约1 mb。

答案 2 :(得分:0)

  

我有一个ListFragment,它实现了一个点击监听器来点击   反对IngredientActivity。当我在中检索对象时   IngredientActivity,对象的变量为空。

我希望您重新考虑结构,您正在做的是通过ID Treatment Patient1 Induction Chemo Patient2 Hypomethylating Chemo Patient3 Consolidation Chemo 相关ArrayList的{​​{1}}传递Fragment对象,这不是正确的方法。

解决方案:您可能希望使用将通过回调方法将被点击的对象传递给activity的接口(这里我假设您需要在创建片段后设置接口)

一样
Activity

并在活动中:

        public class ListFragment extends Fragment {
        ....

        private ListItemClickListener mListener;

        public void setListClickListner(ListItemClickListener listener){
        this.mListener=listener;
        }

/**Note : you will need to call      
mListener.onListItemClick(selectedRecipe);
in the relavent click event of ListView/RecyclerView with instance of 
receipe. */

}

我希望这是有道理的。

答案 3 :(得分:0)

您可以使用Android Parcelable或Java Serializable接口。两者都有效。对于性能级别,parcelable比可序列化更快。