Я использую привязку данных и MVVM в моем текущем проекте. Вот код одного из экранов, над которым я работаю:
class ActivePlansFragment : Fragment() {
private lateinit var savingPlanViewModel: SavingPlanViewModel
private var isFinancialFreedomPlanOpted = false
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
printLog("On Create View")
return inflater.inflate(R.layout.fragment_active_plans, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
savingPlanViewModel = activityViewModels {
printLog("Setting Adapter For Active plans")
rvAllPlans.apply {
adapter = ActivePlansAdapter().apply {
mBaseAdapterClickListener = { view, position, item ->
if( view.id == R.id.tvAction ) {
if( isCurrentDestination(R.id.savingPlanListFragment) ) {
selectedNeoSavingPlan = item
findNavController().navigate(SavingPlanListFragmentDirections.actionSavingPlanListFragmentToAddFundsFragment())
}
} else {
if( isCurrentDestination(R.id.savingPlanListFragment) ) {
selectedNeoSavingPlan = item
findNavController().navigate(SavingPlanListFragmentDirections.actionSavingPlanListFragmentToSavingPlanDetailsFragment())
}
}
}
onEmptyOrNot = { isEmpty ->
emptyPlansLayout.changeVisibility(isEmpty)
}
//Update : getAllSavingPlan()
observe(allSavingPlanResponsesMutableLiveData) {
it?.onChanged { inProgress, failure, list ->
//fabCreatePlan.isEnabled = !inProgress
planRefreshLayout.isRefreshing = inProgress
if (!inProgress)
if (failure != null) {
handleFailures(failure) { getAllSavingPlan() }
allSavingPlanResponsesMutableLiveData.clearValue()
} else if (list != null) {
removeAll()
val filteredList = list.filter { plan ->
plan.active
|| plan.status == NeoSavingPlanResponse.COMPLETED
|| plan.status == NeoSavingPlanResponse.CREATE_INITIATED
|| plan.status == NeoSavingPlanResponse.DELETE_INITIATED
}
addAll(filteredList)
isFinancialFreedomPlanOpted = list.find { plan -> plan.planType == NeoMasterSavingPlan.FINANCIAL_FREEDOM_PLAN } != null
}
}
}
}
}
planRefreshLayout.setOnRefreshListener {
getAllSavingPlan()
}
}
}
}
Проблема, с которой я сталкиваюсь, - это адаптер, а остальная логика снова настраивается, когда я возвращаюсь к экрану. Я ищу некоторую помощь с точки зрения того, где установить логику пользовательского интерфейса, чтобы избежать сброса пользовательского интерфейса.
> Logcat logs :
>
> D/ActivePlansFragment: On Create View
> D/ActivePlansFragment: Setting Adapter For Active plans
> D/ActivePlansFragment: On Create View
> D/ActivePlansFragment: Setting Adapter For Active plans
Обновление: я переместил логику выборки плана в onResume, который обрабатывал мерцание пользовательского интерфейса. Но адаптер снова устанавливается, когда пользователь возвращается к экрану. Это связано с жизненным циклом фрагмента, поэтому я думаю, что нет никакого способа обойти это. Поправь меня, если я ошибаюсь.
override fun onResume() {
super.onResume()
savingPlanViewModel.getAllSavingPlan()
}
Дополнительное примечание: я использую компоненты навигации Android.
Сам фрагмент является частью родительского фрагмента с viewpager в его xml. Viewpager является хостом для активных / неактивных планов дочерних фрагментов. Для пейджера представления родительского класса установлено ограничение на количество страниц за пределами экрана 2.
savingPlanViewPager.adapter = SavingPlanViewPagerAdapter(childFragmentManager)
savingPlanViewPager.offscreenPageLimit = 2
savingPlanTabLayout.setupWithViewPager(savingPlanViewPager)