gpt4 book ai didi

android - 导航项更改不会更新回收站 View

转载 作者:行者123 更新时间:2023-12-02 13:16:21 25 4
gpt4 key购买 nike

我有一个带有导航 View 的 DrawerLayout Activity 。这些项目是“主页”、“关于我们”、“Activity 日程”等。 Activity 日程有一个 fragment ,其中包含底部抽屉导航和 View 寻呼机。只有 2 个 fragment 附加到 viewpager - 第 1 天时间表和第 2 天时间表。同样,底部导航中只有 2 个项目。这些 fragment 中的每一个都有一个回收器 View ,我在其中显示事件列表及其日期和时间。
当我启动应用程序时,主页 fragment 按预期弹出。我转到抽屉导航并单击“Activity 时间表”。回收站 View 加载数据。我可以在 View 寻呼机上滑动。一切正常。
但是现在当我点击“关于我们”时,该 fragment 照常打开。当我重新打开“事件和时间表”时,回收站 View 不显示任何列表项。它适用于我第一次单击它,但不是第二次,第三次等等。
EventsFragment.kt(带有 viewpager 和底部导航的主要 fragment ):

class EventsFragment : Fragment(R.layout.fragment_events) {

...

private fun setupViewPager() {
binding.viewPagerScheduleDay.adapter = EventDayPagerAdapter(requireActivity().supportFragmentManager)
binding.bottomNav.setOnNavigationItemSelectedListener {
when (it.itemId) {
R.id.mDay1 -> binding.viewPagerScheduleDay.currentItem = 0
R.id.mDay2 -> binding.viewPagerScheduleDay.currentItem = 1
}
true
}
}
}
EventDayFragment.kt(viewpager 中的 fragment ):
class EventDayFragment : Fragment(R.layout.fragment_event_day) {

...

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
binding = FragmentEventDayBinding.bind(view)

val day = arguments?.getInt(PARAM_1)!!
loadDataToRecyclerView(day)
}

private fun loadDataToRecyclerView(day: Int) {
Database.getEventsFromDay(day) { events ->
events?.let {
val eventAdapter = EventScheduleRecyclerAdapter(requireContext(), it)
binding.recyclerViewEventsSchedule.apply {
layoutManager = StaggeredGridLayoutManager(2, VERTICAL)
adapter = eventAdapter
setHasFixedSize(true)
}
} ?: requireContext().toast("Error Encountered in collecting data.")
}
}
}
在我的代码中,我注意到在 EventDayFragment.kt 中,onViewCreated 函数只被调用了一次。这就是为什么recyclerview 只工作一次的原因。我该如何解决?
编辑
class EventDayFragment : Fragment(R.layout.fragment_event_day) {

companion object {
...
var isAlive = false
}

override fun onAttach(context: Context) {
super.onAttach(context)
isAlive = true
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
binding = FragmentEventDayBinding.bind(view)

val day = arguments?.getInt(PARAM_1)!!
loadDataToRecyclerView(day)
}

private fun loadDataToRecyclerView(day: Int) {
... // Same as before
}

override fun onPause() {
super.onPause()
isAlive = false
}
}
我添加了一个静态 bool 变量来了解 fragment 是否正在运行。在 EventsFragment 中,我将此代码添加到 setupViewPager() :
    private fun setupViewPager() {
val eventDayFragmentAdapter = EventDayFragmentAdapter(
requireActivity().supportFragmentManager
)
binding.viewPagerScheduleDay.adapter = eventDayFragmentAdapter

val fragment = eventDayFragmentAdapter.getItem(binding.viewPagerScheduleDay.currentItem)
if (EventDayFragment.isAlive)
fragment.loadDataToRecyclerView(binding.viewPagerScheduleDay.currentItem + 1)
binding.bottomNav.setOnNavigationItemSelectedListener {
when (it.itemId) {
R.id.mDay1 -> binding.viewPagerScheduleDay.currentItem = 0
R.id.mDay2 -> binding.viewPagerScheduleDay.currentItem = 1
}
true
}
}
执行此编辑后,我收到此错误:EventDayFragment 未附加到上下文。

最佳答案

为什么:
没错,EventDayFragment View 没有被破坏,所以 onViewCreated 在第一次数据工作时只被调用一次,并且创建了 EventsSchedule 的子 fragment (据我了解,EventSchedule 包含 viewPager 和两个子 fragment 第 1 天时间表和第 2 天时间表),但是当您单击 About us 时,EventsSchedule fragment 本身不会被销毁,但这并不一定适用于它的 child (第 1 天的时间表和第 2 天的时间表),并且当他们再次被创建时, child 可能会被销毁第二次,他们找不到数据(因为父级没有像他们一样被破坏)
如何解决:
我认为有很多解决方案:

  • 在子 fragment 的 onViewCreated() 内部向父 fragment 询问数据,并在子 fragment 本身内部生成 loadDataToRecyclerView(day)。
  • (快速但不推荐)尝试将 loadDataToRecyclerView(day) 移动到
    onResume() 而不是 onViewCreated()
  • 关于android - 导航项更改不会更新回收站 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63850394/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com