Как передать связку с ArrayList из фрагмента в активность - PullRequest
0 голосов
/ 24 мая 2018

У меня есть 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 голосов
/ 24 мая 2018

Вы можете использовать интерфейс Android Parcelable или Java Serializable.Оба будут работать.С уровнем производительности parcelable быстрее, чем сериализуемый.

0 голосов
/ 24 мая 2018

Правильно ли вы реализовали объект Parcelable?

После посылки у вас может быть другой объект адреса, потому что объект воссоздается с этими данными.

Проверьте реализацию Parcelable объекта Recipe.

0 голосов
/ 24 мая 2018

Похоже, у вас есть проблема в вашем предмете, подлежащем продаже.Убедитесь, что все поля правильно сериализованы.

Другой вариант - ваш объект слишком велик.У Parcelable есть ограничение по размеру, которое связано с намерением - что-то около 1 МБ.

0 голосов
/ 24 мая 2018

У меня есть ListFragment, который реализует прослушиватель щелчков, чтобы передавать щелчковый объект в IngredientActivity.Когда я извлекаю объект в IngredientActivity, переменные объектов равны нулю.

Я хотел бы, чтобы вы переосмыслили структуру, то, что вы делаете, это передаете объект ArrayList через Bundle из * 1006.* релевантный 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. */

}

и в Activity:

public class IngredientActivity extends AppCompatActivity  implements ListRecipeAdapter.ListItemClickListener{

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

    }

    // Callback method
   @Override
    public void onListItemClick(Recipe selectedRecipe) {
        // Whatever thing you want to do goes here...
        mListener.onListItemClick(selectedRecipe);
    }

}

Надеюсь, это имеет смысл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...