ExecutePendingBindings предотвращает анимацию перехода фрагмента - PullRequest
0 голосов
/ 27 апреля 2019

Я пытаюсь добавить анимацию к моим Fragment транзакциям.Все выглядит хорошо, кроме одного случая.Это Fragment содержит RecyclerView, который устанавливается с databinding.Данные также связаны через ObservableArrayList с binding.

Это то, что происходит в Fragment.

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        mViewModel = ViewModelProviders.of(requireActivity(), mViewModelFactory).get(MainMenuViewModel::class.java)
        setHasOptionsMenu(true)
        mBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_main_menu, container, false)
        return with(mBinding) {
            callback = this@MainMenuFragment
            viewModel = mViewModel
            executePendingBindings()
            root
        }
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        loadMenu()
        subscribeToUserNotification()
        subscribeToPromoItemSearchResult()
    }

Этот фрагмент загружается, когда действие запускается и работаеткак и ожидалось.Но после любой другой транзакции фрагмента popAnimation не запускается только для этого фрагмента после добавления executePendingBindings().Существует только задержка в 350 (как установлено для перехода), и фрагмент просто появляется без видимого перехода.

Я бы хотел удалить executePendingBindings(), но у меня возникла другая проблема.Метод loadMenu() обновляет список данных для утилизатора, и при первом запуске данные запрашиваются из Интернета, и поэтому с небольшой задержкой связывание успевает инициализировать все зависимости.Но когда я нажимаю назад после второй транзакции фрагмента, данные уже присутствуют, и когда мой BindingAdapter активирован, адптер утилизатора имеет нулевое значение и не отображается вообще.Даже если метод loadMenu() находится в onViewCreated, а привязка инициализируется в onCreateView.

Таким образом, решением будет либо исправить переход, либо исправить привязку, не инициализируемую вовремя.

Добавление моего адаптера привязки и XML для справки

@BindingAdapter("category_list")
    public static void addCategoriesToAdapter(RecyclerView recyclerView, ObservableArrayList<MainMenuCategory> catList) {
        MenuCategoriesAdapter adapter = (MenuCategoriesAdapter) recyclerView.getAdapter();
        if (adapter != null) { //here the adapter happens to be null when onBackPressed after a second fragment transaction
            adapter.getCategories().clear();
            adapter.getCategories().addAll(catList);
            adapter.notifyDataSetChanged();
        }
    }

        <androidx.recyclerview.widget.RecyclerView
            app:adapter="@{callback.getCategoriesAdapter()}"
            app:category_list="@{viewModel.catList}"
            app:manager="@{callback.getMenuLayoutManager()}" />
...