From 855a7e18a795f0db2453a19e3e8f26ba2ff553b4 Mon Sep 17 00:00:00 2001 From: lmw <125975490@qq.com> Date: 星期四, 29 五月 2025 16:32:41 +0800 Subject: [PATCH] UI调整 --- app/src/main/java/com/dollearn/student/ui/home/MatchActivity.kt | 335 +++++++++++++++++++++++++++---------------------------- 1 files changed, 164 insertions(+), 171 deletions(-) diff --git a/app/src/main/java/com/dollearn/student/ui/home/MatchActivity.kt b/app/src/main/java/com/dollearn/student/ui/home/MatchActivity.kt index 5e9349e..8c96584 100644 --- a/app/src/main/java/com/dollearn/student/ui/home/MatchActivity.kt +++ b/app/src/main/java/com/dollearn/student/ui/home/MatchActivity.kt @@ -1,212 +1,205 @@ package com.dollearn.student.ui.home -import android.Manifest -import android.view.animation.AnimationUtils +import android.annotation.SuppressLint +import android.os.Handler +import android.os.Looper +import android.os.Message +import android.view.ViewGroup +import androidx.core.os.bundleOf +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentPagerAdapter import androidx.recyclerview.widget.LinearLayoutManager +import androidx.viewpager.widget.ViewPager import cn.sinata.xldutils.gone -import cn.sinata.xldutils.utils.SpanBuilder -import cn.sinata.xldutils.utils.myToast import cn.sinata.xldutils.visible -import com.amap.api.location.AMapLocationListener import com.dollearn.student.R -import com.dollearn.student.WeparkApplication +import com.dollearn.student.dialog.TipDialog import com.dollearn.student.network.HttpManager -import com.dollearn.student.network.entity.CommonData -import com.dollearn.student.network.entity.Match +import com.dollearn.student.network.entity.SortBean +import com.dollearn.student.network.entity.SubjectBean import com.dollearn.student.network.request import com.dollearn.student.ui.TransparentStatusBarActivity -import com.dollearn.student.ui.home.adapter.FilterAdapter -import com.dollearn.student.ui.home.adapter.MatchAdapter -import com.dollearn.student.ui.home.adapter.OpenCityAdapter -import com.dollearn.student.utils.AMapKit -import com.dollearn.student.utils.extention.clickDelay -import com.dollearn.student.utils.extention.getInitial -import com.tbruyelle.rxpermissions2.RxPermissions -import kotlinx.android.synthetic.main.activity_match.* -import org.jetbrains.anko.startActivity -import org.jetbrains.anko.textColorResource +import com.dollearn.student.ui.home.adapter.IndexAdapter +import com.dollearn.student.utils.Const +import com.dollearn.student.utils.event.EmptyEvent +import kotlinx.android.synthetic.main.activity_listen.* +import org.greenrobot.eventbus.EventBus -class MatchActivity : TransparentStatusBarActivity() { - override fun setContentView() = R.layout.activity_match +class MatchActivity:TransparentStatusBarActivity() { + override fun setContentView() = R.layout.activity_listen - private val datas = arrayListOf<Match>() - private val adapter = MatchAdapter(datas) + private val day by lazy { + intent.getIntExtra("day",0) + } + private val week by lazy { + intent.getIntExtra("week",0) + } + private val season by lazy { + intent.getIntExtra("season",0) + } + val data by lazy { intent.getParcelableExtra<SubjectBean>("data") } + val fragments = arrayListOf<Fragment>() - private val index = arrayListOf( - "A", "B", "C", "D", "E", "F", "G", "H", "I", - "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" - ) - //筛选条件 - private val cityList = arrayListOf<CommonData>() //展示数据源(搜索后过滤) - private val cityAdapter = OpenCityAdapter(cityList) - var cityCode:String? = null //城市 - var condition:Int? = null //1=全部用户,2=仅限年度会员参与,3=仅限运动营成员参与 - var heatSort:String? = null //销量排序(asc=正序,desc=降序) - var search:String? = null //搜索 + var totalCount = 0 //总答题次数 + var rightCount = 0 //正确答题次数 + var time = 0 //学习秒数 + private var handler:Handler? = null + + val indexList = arrayListOf<SortBean>() + private val indexAdapter = IndexAdapter(indexList) - private val filters = arrayListOf("全部用户参与","仅限年度会员参与","仅限运动营成员参与") //筛选选项 - private val filterAdapter = FilterAdapter(filters) + val vp by lazy { view_pager } + var recoverd = false //true已经恢复了进度,后续语音可以自动播放 override fun initClick() { - tv_search.clickDelay { - val s = et_search.text.toString() - search = if (s.isNullOrEmpty()) null else s - refreshLayout.autoRefresh() - } - filterAdapter.setOnItemClickListener { view, position -> - filterAdapter.checkedIndex = position - filterAdapter.notifyDataSetChanged() - cb_condition.isChecked = false - condition = position+1 - cb_condition.text = if (position == 0) "全部用户" else if (position == 1) "仅限会员" else "仅限运动营成员" - refreshLayout.autoRefresh() - } - cityAdapter.setOnItemClickListener { view, position -> - cb_city.isChecked = false - cityCode = cityList[position].code - cb_city.text = cityList[position].name - refreshLayout.autoRefresh() - } - tv_current.setOnClickListener { - if (WeparkApplication.cityCode.isNotEmpty()){ - cb_city.isChecked = false - cityCode = WeparkApplication.cityCode - cb_city.text = WeparkApplication.cityName - refreshLayout.autoRefresh() - } - } - tv_refresh.setOnClickListener { - val subscribe = - RxPermissions(this).request(Manifest.permission.ACCESS_FINE_LOCATION) - .subscribe { - if (it){ - AMapKit.initLocation(this, AMapLocationListener { - WeparkApplication.lat = it.latitude - WeparkApplication.lon = it.longitude - WeparkApplication.province = it.province - WeparkApplication.provinceCode = "${it.adCode.substring(0,3)}000" - WeparkApplication.cityName = it.city - WeparkApplication.cityCode = "${it.adCode.substring(0,4)}00" - tv_current.text = it.city - }) - }else - myToast("没有定位权限") + tv_last.setOnClickListener { + val tipDialog = TipDialog() + tipDialog.arguments = bundleOf("msg" to "是否重新开始答题?确认后将清空当前答题进度") + tipDialog.setCallback(object :TipDialog.OnClickCallback{ + override fun onOk() { + showDialog() + HttpManager.restart(day,week,5).request(this@MatchActivity){_,_-> + totalCount = 0 //总答题次数 + rightCount = 0 //正确答题次数 + time = 0 //学习秒数 + indexList.forEach { it.status = 1 } + indexAdapter.notifyDataSetChanged() + data?.accuracy = 0.0 + view_pager.setCurrentItem(0,false) + (fragments[0] as MatchFragment).recover() } + } + + override fun onCancel() { + } + }) + tipDialog.show(supportFragmentManager,"restart") } - adapter.setOnItemClickListener { _, position -> - startActivity<MatchDetailActivity>("id" to datas[position].id) + + tv_exit.setOnClickListener { + onBackPressed() } - cb_city.setOnCheckedChangeListener { _, isChecked -> - if (!isChecked) - closeFilter() - else{ - if (cb_condition.isChecked) - cb_condition.isChecked = false - bg_filter.visible() - cl_city.visible() - val loadAnimation = AnimationUtils.loadAnimation(this, R.anim.popup_in_from_top) - cl_city.startAnimation(loadAnimation) + + indexAdapter.setOnItemClickListener { view, position -> + val sortBean = indexList[position] + if (position!=view_pager.currentItem&&(sortBean.status!=1||position == indexList.indexOf(indexList.first { it.status == 1 }))){ + view_pager.setCurrentItem(position,false) + (fragments[position] as MatchFragment).recover() } } - cb_condition.setOnCheckedChangeListener { _, isChecked -> - if (!isChecked) - closeFilter() - else{ - if (cb_city.isChecked) - cb_city.isChecked = false - bg_filter.visible() - rv_condition.visible() - val loadAnimation = AnimationUtils.loadAnimation(this, R.anim.popup_in_from_top) - rv_condition.startAnimation(loadAnimation) - } + } + + fun next(){ + val listenFragment = fragments[view_pager.currentItem] as MatchFragment + val sortBean = indexList[view_pager.currentItem] + sortBean.status = if (listenFragment.right) 2 else 3 //修改本地答题结果,并上传服务器 + HttpManager.answerQuestion(sortBean).request(this){_,data-> + //保存成功 } - tv_heat.clickDelay { - if (cb_city.isChecked) - cb_city.isChecked = false - if (cb_condition.isChecked) - cb_condition.isChecked = false - tv_heat.textColorResource = R.color.colorPrimary - if (heatSort == null||heatSort == "asc") - heatSort = "desc" - else - heatSort = "asc" - tv_heat.setCompoundDrawablesRelativeWithIntrinsicBounds(0,0,if (heatSort == "asc")R.mipmap.sort_asc else R.mipmap.sort_desc,0) - refreshLayout.autoRefresh() - } - bg_filter.setOnClickListener { - if (cb_condition.isChecked) - cb_condition.isChecked = false - else if (cb_city.isChecked) - cb_city.isChecked = false - } - tv_record.setOnClickListener { - startActivity<MyMatchActivity>() + val filter = indexList.filter { it.status != 1 } + data?.accuracy = filter.filter { it.status == 2 }.size.toDouble() / filter.size + if (view_pager.currentItem == fragments.lastIndex){ + handler?.removeMessages(0) + ResultActivity.startResult(this,day,week,season,5,totalCount,rightCount,data!!.data.integral,time,data!!.data.id) + finish() + }else{ + view_pager.setCurrentItem(view_pager.currentItem+1,true) + (fragments[view_pager.currentItem] as MatchFragment).recover() + tv_last.visible() + indexAdapter.notifyDataSetChanged() } } override fun initView() { - if (WeparkApplication.cityName.isNotEmpty()){ - cb_city.text = WeparkApplication.cityName - cityCode = WeparkApplication.cityCode + rv_index.layoutManager = LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL,false) + rv_index.adapter = indexAdapter + data?.apply { + tv_progress.text = "已完成:1/%d\n正确率:%.2f%s".format(subjectList.size,accuracy*100,"%") + indexList.clear() + indexList.addAll(list) + indexAdapter.notifyDataSetChanged() + subjectList.forEachIndexed { index, subject -> + fragments.add(MatchFragment.getInstance(index)) + } + view_pager.adapter = @SuppressLint("WrongConstant") + object : FragmentPagerAdapter(supportFragmentManager,0) { + override fun getItem(p0: Int): Fragment { + return fragments[p0] + } + + override fun getCount(): Int { + return fragments.size + } + + override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) { + } + } + view_pager.offscreenPageLimit = fragments.size + view_pager.addOnPageChangeListener(object :ViewPager.OnPageChangeListener{ + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + tv_progress.text = "已完成:%d/%d\n正确率:%.2f%s".format(position+1,subjectList.size,accuracy*100,"%") + } + + override fun onPageScrollStateChanged(state: Int) { + } + }) } - rv_course.layoutManager = LinearLayoutManager(this) - rv_course.adapter = adapter - refreshLayout.setOnRefreshListener { - getData() - } - getData() - //筛选 - rv_city.layoutManager = LinearLayoutManager(this) - rv_city.adapter = cityAdapter - side_bar.setOnSelectIndexItemListener { index -> - (0 until cityList.size).forEach { - if (index == cityList[it].name?.getInitial()) { - val manager = rv_city.layoutManager as LinearLayoutManager - manager.scrollToPositionWithOffset(it, 0) - return@setOnSelectIndexItemListener + recover() + handler= object :Handler(Looper.myLooper()!!){ + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + if (msg.what == 0){ + time++ + handler?.sendEmptyMessageDelayed(0,1000L) } } } - rv_condition.layoutManager = LinearLayoutManager(this) - rv_condition.adapter = filterAdapter - filterAdapter.checkedIndex = -1 - tv_current.text = SpanBuilder("当前城市:${WeparkApplication.cityName}").color(this,0,5,R.color.textColor).build() - //获取城市筛选项数据 - getCity() + handler?.sendEmptyMessageDelayed(0,1000L) } - private fun getData(){ - HttpManager.queryCompetitionList(cityCode,condition,heatSort, search).request(this,success = {_,data-> - refreshLayout.finishRefresh() - datas.clear() - datas.addAll(data?: arrayListOf()) - adapter.notifyDataSetChanged() - }){_,_-> - refreshLayout.finishRefresh(false) + private fun recover(){ + HttpManager.teamSchedule(day,week,5).request(this){_,data-> + view_pager.setCurrentItem((data?.schedule?:1)-1,false) + if (view_pager.currentItem != 0) + tv_last.visible() + totalCount = data?.answerNumber?:0 + rightCount = data?.correctNumber?:0 + + EventBus.getDefault().post(EmptyEvent(Const.EventCode.RECOVERD)) + recoverd = true } } - private fun getCity(){ - HttpManager.queryAllCity().request(this){_,data-> - data?.let { - cityList.clear() - index.forEach { index-> - it.filter { it.name.isNotEmpty() }.forEach { - if (index == it.name.getInitial()){ - cityList.add(it) - } - } + override fun onBackPressed() { + val tipDialog = TipDialog() + tipDialog.arguments = bundleOf("msg" to "未完成全部答题,确认退出吗?") + tipDialog.setCallback(object :TipDialog.OnClickCallback{ + override fun onOk() { + val list = (data?.subjectList?: arrayListOf()).flatMap { it }.subList(0,view_pager.currentItem) + HttpManager.exitLearning(view_pager.currentItem,season,time,totalCount,rightCount,day,week,5,data?.data?.id?:"", list.joinToString(",") { it.id }).request(this@MatchActivity){ _, _-> + finish() } - adapter.notifyDataSetChanged() } - } + + override fun onCancel() { + } + }) + tipDialog.show(supportFragmentManager,"exit") } - - private fun closeFilter(){ - bg_filter.gone() - rv_condition.gone() - cl_city.gone() + override fun onDestroy() { + super.onDestroy() + handler?.removeMessages(0) + handler = null + EventBus.getDefault().post(EmptyEvent(Const.EventCode.STOP_TIMER)) } } -- Gitblit v1.7.1