SafetyLearnActivity.kt 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. package com.dlc.exam.ui.learn
  2. import android.content.Context
  3. import android.content.Intent
  4. import android.graphics.Color
  5. import android.os.Bundle
  6. import android.view.LayoutInflater
  7. import android.view.View
  8. import android.widget.CheckBox
  9. import com.chad.library.adapter.base.BaseQuickAdapter
  10. import com.chad.library.adapter.base.viewholder.BaseViewHolder
  11. import com.dlc.exam.ExamApp
  12. import com.dlc.exam.R
  13. import com.dlc.exam.common.ExamType
  14. import com.dlc.exam.databinding.ActivitySafetyLearnBinding
  15. import com.dlc.exam.databinding.TreeHolderSelectableHeaderBinding
  16. import com.dlc.exam.ui.common.CommonListActivity
  17. import com.dlc.exam.ui.common.PageQuickAdapter
  18. import com.dlc.exam.ui.me.PersonalCenterActivity
  19. import com.dlc.exam.ui.widget.ListPageView
  20. import com.dlc.exam.ui.widget.TitleBar
  21. import com.dlc.exam.ui.widget.treeview.model.TreeNode
  22. import com.dlc.exam.ui.widget.treeview.view.AndroidTreeView
  23. import com.rc.httpcore.HttpClient
  24. import com.rc.httpcore.client.ApiRepository
  25. import com.rc.httpcore.vo.request.CourseListReq
  26. import com.rc.httpcore.vo.response.CategoryTree
  27. import com.rc.httpcore.vo.response.ExamCourseVo
  28. import io.reactivex.disposables.Disposable
  29. /**
  30. * 安全学习
  31. *
  32. * @author ReiChin_
  33. */
  34. class SafetyLearnActivity :
  35. CommonListActivity<ExamCourseVo, ActivitySafetyLearnBinding>(SafetyLearnAdapter()),
  36. TitleBar.TitleListener {
  37. init {
  38. mAdapter.addChildClickViewIds(R.id.detail)
  39. }
  40. override val mSrlRefresh by lazy { viewBinding.swipeRefreshLayout }
  41. override val mRvContent by lazy { viewBinding.content }
  42. override val mListPageView by lazy { viewBinding.pageInfo }
  43. private lateinit var mTreeView: AndroidTreeView
  44. private var mCateId: String? = null
  45. private var mTitle: String? = null
  46. override fun createViewBinding() = ActivitySafetyLearnBinding.inflate(LayoutInflater.from(this))
  47. private val mExamTypeList = mutableListOf<CheckBox>()
  48. override fun initListener() {
  49. super.initListener()
  50. // 全部适用类型
  51. viewBinding.allType.setOnClickListener { view ->
  52. mExamTypeList.forEach { it.isChecked = it == view }
  53. mCurrentPage = ListPageView.FIRST_PAGE
  54. loadData(true)
  55. }
  56. // 安全准入考试
  57. viewBinding.safetyExam.setOnClickListener { view ->
  58. mExamTypeList.forEach { it.isChecked = it == view }
  59. mCurrentPage = ListPageView.FIRST_PAGE
  60. loadData(true)
  61. }
  62. // 负面清单考试
  63. viewBinding.negativeExam.setOnClickListener { view ->
  64. mExamTypeList.forEach { it.isChecked = it == view }
  65. mCurrentPage = ListPageView.FIRST_PAGE
  66. loadData(true)
  67. }
  68. // 黑名单考试
  69. viewBinding.blackListExam.setOnClickListener { view ->
  70. mExamTypeList.forEach { it.isChecked = it == view }
  71. mCurrentPage = ListPageView.FIRST_PAGE
  72. loadData(true)
  73. }
  74. }
  75. override fun initViews(savedInstanceState: Bundle?) {
  76. super.initViews(savedInstanceState)
  77. viewBinding.titleBar.setTitleListener(this)
  78. viewBinding.titleBar.setUsername(ExamApp.sLearnLoginVo?.userName)
  79. mExamTypeList.clear()
  80. mExamTypeList.add(viewBinding.allType)
  81. mExamTypeList.add(viewBinding.safetyExam)
  82. mExamTypeList.add(viewBinding.blackListExam)
  83. mExamTypeList.add(viewBinding.negativeExam)
  84. // 学习记录
  85. viewBinding.learnRecord.setOnClickListener {
  86. startActivity(Intent(this, LearnRecordActivity::class.java))
  87. // val learnChapterList = ArrayList<LearnChapterBean>()
  88. // learnChapterList.add(LearnChapterBean().apply {
  89. // chapterId = "123"
  90. // courseId = "321"
  91. //
  92. // type = "2"; // 0 为目录 其他类型同课件类型 文件类型 1 文档,2 视频,3 图片,4 音频,5 富文本
  93. // chapterData = "http://mpvideo.qpic.cn/0b2eweaamaaauqaa7t5wqvqvbmoda2yqabqa.f10002.mp4?dis_k=8a466e6d05b1b427bd3e96a09366d287&amp;dis_t=1640341670&amp;vid=wxv_2176467267104899076&amp;format_id=10002&amp;support_redirect=0&amp;mmversion=false"
  94. // duration = 74
  95. // title = "航拍正在建设中西安地铁十号线浐灞段"
  96. // })
  97. //
  98. // val intent = Intent(this, LearnDetailActivity::class.java)
  99. // intent.putExtra("nextChapter", learnChapterList)
  100. // intent.putExtra("relearn", true)
  101. // startActivityForResult(intent, 100)
  102. }
  103. viewBinding.search.setOnClickListener {
  104. mTreeView.deselectAll()
  105. mCateId = null
  106. mTitle = viewBinding.key.text.toString().trim()
  107. mCurrentPage = ListPageView.FIRST_PAGE
  108. loadData(true)
  109. }
  110. handleDefaultScopeType()
  111. queryCategoryTree()
  112. }
  113. private fun handleDefaultScopeType() {
  114. when (intent.getStringExtra("exam_type")) {
  115. ExamType.NEGATIVE.type -> defaultCheckedView(viewBinding.negativeExam)
  116. ExamType.BLACK_LIST.type -> defaultCheckedView(viewBinding.blackListExam)
  117. }
  118. }
  119. private fun defaultCheckedView(view: View) {
  120. mExamTypeList.forEach { it.isChecked = it == view }
  121. mCurrentPage = ListPageView.FIRST_PAGE
  122. }
  123. private fun queryCategoryTree() {
  124. showLoading("加载中...")
  125. val disposable = ApiRepository.categoryTreeList()
  126. .subscribe({
  127. dismissLoading()
  128. initCategoryTree(it)
  129. }, { throwable ->
  130. dismissLoading()
  131. throwable.printStackTrace()
  132. showNetError(throwable)
  133. })
  134. addDisposable(disposable)
  135. }
  136. private fun initCategoryTree(nodeData: List<CategoryTree>) {
  137. val root = TreeNode.root()
  138. val categoryTree = CategoryTree().apply {
  139. id = ""
  140. title = "所有分类"
  141. }
  142. val treeNode = TreeNode(TreeItem(categoryTree))
  143. treeNode.viewHolder = ArrowExpandSelectableHeaderHolder(this)
  144. treeNode.setClickListener { node, value ->
  145. dispatchTreeNodeClicked(node, value as TreeItem)
  146. }
  147. treeNode.isSelected = true
  148. root.addChildren(treeNode)
  149. fillFolder(root, nodeData)
  150. mTreeView = AndroidTreeView(this, root)
  151. mTreeView.setDefaultAnimation(true)
  152. mTreeView.setDefaultContainerStyle(R.style.TreeNodeStyleCustom)
  153. mTreeView.isSelectionModeEnabled = true
  154. viewBinding.courseType.addView(mTreeView.view)
  155. mTreeView.setUseAutoToggle(false)
  156. }
  157. private fun fillFolder(node: TreeNode, nodeData: List<CategoryTree>?) {
  158. nodeData?.forEach { item ->
  159. val childNode = TreeNode(TreeItem(item))
  160. childNode.viewHolder = ArrowExpandSelectableHeaderHolder(this)
  161. childNode.setClickListener { node, value ->
  162. dispatchTreeNodeClicked(node, value as TreeItem)
  163. }
  164. node.addChild(childNode)
  165. fillFolder(childNode, item.children)
  166. }
  167. }
  168. private fun dispatchTreeNodeClicked(node: TreeNode, value: TreeItem) {
  169. mTreeView.deselectAll()
  170. mTreeView.selectNode(node, true)
  171. mCateId = value.data!!.id
  172. mTitle = null
  173. mCurrentPage = ListPageView.FIRST_PAGE
  174. loadData(true)
  175. }
  176. override fun queryData(): Disposable? {
  177. showLoading("查询中...")
  178. val param = CourseListReq().apply {
  179. cateId = mCateId
  180. title = mTitle
  181. pageNum = mCurrentPage
  182. pageSize = ListPageView.PAGE_SIZE
  183. scopeType = encodeScopeType()
  184. }
  185. return ApiRepository.examCourseList(param)
  186. .subscribe({
  187. dismissLoading()
  188. dispatchLoadDataSuccess(it.rows, it.total)
  189. }, { throwable ->
  190. dismissLoading()
  191. dispatchLoadDataFailure(throwable)
  192. })
  193. }
  194. private fun encodeScopeType(): String {
  195. // 1. 安全准入考试,2. 负面清单考试,3. 黑名单考试
  196. return when {
  197. viewBinding.safetyExam.isChecked -> "1"
  198. viewBinding.negativeExam.isChecked -> "2"
  199. viewBinding.blackListExam.isChecked -> "3"
  200. else -> ""
  201. }
  202. }
  203. override fun onItemChildClick(adapter: BaseQuickAdapter<*, *>, view: View, position: Int) {
  204. val item = mAdapter.getItem(position)
  205. // 详情
  206. val intent = Intent(this, CourseChapterActivity::class.java)
  207. intent.putExtra("courseId", item.id)
  208. intent.putExtra("record", false)
  209. startActivity(intent)
  210. }
  211. override fun onRestart() {
  212. super.onRestart()
  213. loadData()
  214. }
  215. override fun onHomeViewClicked(view: View) {
  216. finish()
  217. }
  218. override fun onLogoutViewClicked(view: View) {
  219. callLogoutApi {
  220. showToast("已退出登录")
  221. ExamApp.sLearnLoginVo = null
  222. HttpClient.token = null
  223. finish()
  224. }
  225. }
  226. override fun onBackViewClicked(view: View) {
  227. finish()
  228. }
  229. override fun onUserViewClicked(view: View) {
  230. startActivity(Intent(this, PersonalCenterActivity::class.java))
  231. }
  232. }
  233. class ArrowExpandSelectableHeaderHolder(context: Context) :
  234. TreeNode.BaseNodeViewHolder<TreeItem>(context) {
  235. private lateinit var viewBinding: TreeHolderSelectableHeaderBinding
  236. override fun createNodeView(node: TreeNode?, value: TreeItem?): View {
  237. viewBinding = TreeHolderSelectableHeaderBinding.inflate(LayoutInflater.from(context))
  238. viewBinding.nodeValue.text = value?.data?.title
  239. // if (true == node?.isLeaf) {
  240. // viewBinding.arrowIcon.visibility = View.INVISIBLE
  241. // }
  242. viewBinding.arrowIcon.setOnClickListener {
  243. tView.toggleNode(node)
  244. }
  245. return viewBinding.root
  246. }
  247. override fun toggle(active: Boolean) {
  248. val imageRes = if (active) R.mipmap.ic_substract else R.mipmap.ic_plus
  249. viewBinding.arrowIcon.setImageResource(imageRes)
  250. }
  251. override fun toggleSelectionMode(editModeEnabled: Boolean) {
  252. val textColor = Color.parseColor(if (mNode.isSelected) "#349CFB" else "#333333")
  253. viewBinding.nodeValue.setTextColor(textColor)
  254. }
  255. }
  256. data class TreeItem(val data: CategoryTree?)
  257. private class SafetyLearnAdapter : PageQuickAdapter<ExamCourseVo>(R.layout.item_safety_learn) {
  258. override fun convert(holder: BaseViewHolder, item: ExamCourseVo) {
  259. val pagePosition = pageOffsite + holder.adapterPosition + 1
  260. holder.setText(R.id.number, "$pagePosition")
  261. .setText(R.id.title, item.title)
  262. .setText(R.id.cateTitle, item.cateTitle)
  263. .setText(R.id.chapters, item.chapters)
  264. .setText(R.id.scopeType, item.decodeScopeType())
  265. // .setText(R.id.duration, item.durationsStr)
  266. .setText(R.id.duration, item.durationStr)
  267. .setText(R.id.createTime, item.createTime)
  268. .setText(R.id.accessNum, item.accessNum)
  269. .setText(R.id.learnStatus, item.decodeLearnStatus())
  270. }
  271. }