SectionFragment.kt 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. package com.bearya.kids.section
  2. import android.os.Bundle
  3. import android.view.KeyEvent
  4. import android.view.LayoutInflater
  5. import android.view.View
  6. import android.view.ViewGroup
  7. import android.widget.Toast
  8. import androidx.fragment.app.Fragment
  9. import androidx.fragment.app.viewModels
  10. import androidx.lifecycle.lifecycleScope
  11. import androidx.lifecycle.observe
  12. import androidx.navigation.findNavController
  13. import androidx.navigation.fragment.navArgs
  14. import androidx.recyclerview.widget.LinearLayoutManager
  15. import androidx.viewpager2.widget.ViewPager2
  16. import com.bearya.data.entity.Section
  17. import com.bearya.kids.databinding.FragmentSectionBinding
  18. import com.orhanobut.logger.Logger
  19. import kotlinx.coroutines.*
  20. import library.ext.setData
  21. class SectionFragment : Fragment() {
  22. private lateinit var bindView: FragmentSectionBinding
  23. private val viewModel: SectionViewModel by viewModels()
  24. private val args: SectionFragmentArgs by navArgs()
  25. private val pagerAdapter: SectionPagerAdapter by lazy { SectionPagerAdapter() }
  26. private val previewAdapter: SectionPreviewAdapter by lazy { SectionPreviewAdapter() }
  27. private val pageChangeCallback by lazy {
  28. object : ViewPager2.OnPageChangeCallback() {
  29. override fun onPageSelected(position: Int) {
  30. viewModel.playIndex.setData(position)
  31. }
  32. }
  33. }
  34. override fun onCreate(savedInstanceState: Bundle?) {
  35. super.onCreate(savedInstanceState)
  36. viewModel.chapterId.setData(args.chapterId)
  37. }
  38. override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
  39. bindView = FragmentSectionBinding.inflate(inflater, container, false)
  40. bindView.lifecycleOwner = viewLifecycleOwner
  41. return bindView.root
  42. }
  43. override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
  44. bindView.playPager.adapter = pagerAdapter
  45. bindView.playPager.registerOnPageChangeCallback(pageChangeCallback)
  46. pagerAdapter.onItemClickListener = { _: View, _: Section?, _: Int ->
  47. onItemEvents()
  48. }
  49. bindView.playPager.setOnKeyListener { _, keyCode, event ->
  50. Logger.d("有了点击事件了keycode = $keyCode 和 event = ${event.action}")
  51. if (KeyEvent.ACTION_UP == event.action) {
  52. when (keyCode) {
  53. KeyEvent.KEYCODE_MENU -> onItemEvents()
  54. KeyEvent.KEYCODE_BACK -> view.findNavController().navigateUp()
  55. KeyEvent.KEYCODE_DPAD_LEFT -> {
  56. if (viewModel.playIndex.value ?: 0 > 0) {
  57. viewModel.playIndex.setData(viewModel.playIndex.value?.minus(1))
  58. }
  59. }
  60. KeyEvent.KEYCODE_DPAD_RIGHT -> {
  61. if (viewModel.playIndex.value ?: 0 < viewModel.sectionDirFileSize - 1) {
  62. viewModel.playIndex.setData(viewModel.playIndex.value?.plus(1))
  63. }
  64. }
  65. }
  66. }
  67. true
  68. }
  69. bindView.playPager.setOnFocusChangeListener { v, hasFocus ->
  70. if (!hasFocus) {
  71. v.requestFocus()
  72. }
  73. }
  74. bindView.playList.layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
  75. bindView.playList.adapter = previewAdapter
  76. previewAdapter.onItemClickListener = { _: View, _: Section?, position: Int ->
  77. bindView.playPager.currentItem = position
  78. }
  79. viewModel.sections.observe(viewLifecycleOwner) {
  80. pagerAdapter.submitList(it)
  81. previewAdapter.submitList(it)
  82. viewModel.sectionDirFileSize = it.size
  83. }
  84. viewModel.playIndex.observe(viewLifecycleOwner) {
  85. previewAdapter.setSelectedIndex(it)
  86. }
  87. bindView.back.setOnClickListener { v -> v.findNavController().navigateUp() }
  88. bindView.analysis.setOnClickListener {
  89. val itemData = pagerAdapter.getItemData(bindView.playPager.currentItem)
  90. if (itemData?.hasAnalysis == true) {
  91. val action = SectionFragmentDirections.actionSectionFragmentToAnalysisFragment(itemData.id ?: 1 , itemData.name)
  92. it.findNavController().navigate(action)
  93. } else {
  94. Toast.makeText(context, "暂无该答案", Toast.LENGTH_LONG).show()
  95. }
  96. }
  97. }
  98. override fun onResume() {
  99. super.onResume()
  100. hideSectionPreview()
  101. }
  102. override fun onDestroyView() {
  103. super.onDestroyView()
  104. bindView.playPager.unregisterOnPageChangeCallback(pageChangeCallback)
  105. }
  106. private fun onItemEvents(){
  107. cancelHideSectionPreview()
  108. val visibility = bindView.playList.visibility.takeIf { it == View.VISIBLE }
  109. ?.let { View.GONE } ?: View.VISIBLE
  110. bindView.playList.visibility = visibility
  111. bindView.back.visibility = visibility
  112. bindView.analysis.visibility = visibility
  113. hideSectionPreview()
  114. }
  115. private var launchDelayHide: Job? = null
  116. private fun hideSectionPreview() {
  117. launchDelayHide = lifecycleScope.launch {
  118. delay(3000)
  119. withContext(Dispatchers.Main) {
  120. bindView.playList.visibility.takeIf { it == View.VISIBLE }?.also {
  121. bindView.playList.visibility = View.GONE
  122. bindView.back.visibility = View.GONE
  123. bindView.analysis.visibility = View.GONE
  124. }
  125. }
  126. }
  127. }
  128. private fun cancelHideSectionPreview() = launchDelayHide?.cancel()
  129. }