我有一个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
答案 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比可序列化更快。