Это действие, содержащее фрагмент пейджера, который имеет android.support.v4.view.ViewPager
и класс адаптера, полученный из FragmentStatePagerAdapter
.
Проблема связана с фрагментом пейджера, в котором кэшированы два или три фрагмента, но данные не могут быть проанализированы (включая представление, динамически получающее данные из 3-й части SDK), когда когда-нибудь создается этот фрагмент в случае, если свернуть / открыть его снова или после поворота восстановленный фрагмент остается пустым (используется тот из кеша и не хватает данных).
Не найти способ повторно заполнить фрагменты, восстановленные ОС, через поток восстановления фрагмента пейджера.
Даже пытался во фрагменте пейджера очистить данные адаптера в onActivityCreated ()
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
val childFragmentManager = childFragmentManager
mAdapter = ContentPagerAdapter( activity as Context,
childFragmentManager, emptyList())
mContentViewPager!!.setAdapter(mAdapter)
mAdapter?.setData(emptyList())
}
адаптер:
fun setData(itemsList: List<Data>) {
this.data = itemsList
notifyDataSetChanged()
}
viewPager, кажется, все еще показывает предыдущий кэшированный фрагмент без ожидаемых данных после завершения процесса повторного создания. (попытался убедиться, что это из кэшированного, с помощью фрагмента onsaveInstance()
, чтобы сохранить положение данных в списке данных адаптера, и воссозданный фрагмент в viewPager получил эту позицию, так что это ос воссоздал один из кеша. Но как это могло быть после того, как при beging уже установил адаптер с пустым списком в onActivityCreated()
).
Невозможно разрешить с помощью очистки фрагментов, установив пустые данные.
Поэтому попытался удалить фрагмент страницы из действия в onDestroy()
с надеждой, что в кеше не будет фрагмента, который будет помещен в кэш:
class ContentPagerFragment :Fragment {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view = inflater.inflate(R.layout.content_pager, container, false)
mContentViewPager = view.findViewById(R.id.contentViewPager)
return view
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
val childFragmentManager = childFragmentManager
mAdapter = ContentPagerAdapter( activity as Context,
childFragmentManager, emptyList())
mContentViewPager!!.setAdapter(mAdapter)
mAdapter?.setData(emptyList())
}
interface RemoveFragmentAtClose {
fun onContentPagerFragmentDoestroy()
}
override fun onDestroy() {
(activity as? RemoveAtCloseFragment)?
.onContentPagerFragmentDoestroy()
super.onDestroy()
}
}
и в хостинге
class HostActivity : AppCompatActivity(),
ContentPagerFragment.RemoveFragmentAtClose {
override fun onContentPagerFragmentDoestroy() {
supportFragmentManager.beginTransaction().
remove(supportFragmentManager.findFragmentById(R.id.pagerFragmentContainer))
.commitAllowingStateLoss()
var contentPagerFragment = ContentPagerFragment::class.java.cast(supportFragmentManager
.findFragmentById(R.id.pagerFragmentContainer))
Log.i(TAG, " onContentPagerFragmentDoestroy(), this $this" +
"\ngetContentPagerFragment: $contentPagerFragment"
)
}
override fun onAttachFragment(fragment: Fragment) {
Log.d(TAG, " onAttachFragment(), " +
"fragment: $fragment \nthis $this")
}
}
Но журнал показывает, что supportFragmentManager.findFragmentById(R.id.pagerFragmentContainer)
все еще находит фрагмент после вызова .commitAllowingStateLoss()
.
И когда os восстанавливает активность, ContentPagerFragment отображается в onAttachFragment(fragment: Fragment)
действия до вызова действия onCreate(savedInstanceState: Bundle?)
.
Почему viewPager использует старый фрагмент после удаления фрагмента пейджера из supportFragmentManager действия?
Как запретить пейджеру представления использовать кэшированный фрагмент?