From 53f33b35e03c993e2dd959573e769600f17bced4 Mon Sep 17 00:00:00 2001 From: zhanglei <350328959@qq.com> Date: Wed, 4 Mar 2026 16:57:27 +0800 Subject: [PATCH] =?UTF-8?q?feat(home):=20=E6=96=B0=E5=A2=9E=E9=A6=96?= =?UTF-8?q?=E9=A1=B5=E6=89=8B=E8=A1=A8=E7=9B=91=E6=B5=8B=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=B1=95=E7=A4=BA=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 HomeWatchView 自定义 View,在首页展示手表监测数据概览 - 新增 WatchItemFragment 用于展示步数、心率、血氧、睡眠、压力等指标 - 新增两个 API 接口:查询用户手表绑定状态、获取当日全量手表数据 - HomeFragment 集成手表 View,登录后自动拉取手表信息及当日数据 - 新增 WatchDataChangeEvent 用于手表数据变更通知 - 新增相关布局、Tab 图标及 Drawable 资源文件 - 清理废弃颜色文件(color_child_tab_*.xml)及冗余布局 注:当前 UrlConfig 环境为 DEBUG,正式发布前请切换回 PRODUCT Co-Authored-By: Claude Sonnet 4.6 --- .../healthyclients/bean/home/HomeWatchBean.kt | 25 +++ .../xjjk/healthyclients/data/api/HomeApi.kt | 15 ++ .../data/repository/HomeRepository.kt | 20 ++ .../event/WatchDataChangeEvent.kt | 12 ++ .../healthyclients/fragment/HomeFragment.kt | 38 +++- .../fragment/WatchItemFragment.kt | 144 +++++++++++++ .../healthyclients/superfuntion/ViewExt.kt | 18 +- .../ui/activity/InterventionWebActivity.kt | 2 + .../ui/viewmodel/HomeViewModel.kt | 31 ++- .../xjjk/healthyclients/view/HomeWatchView.kt | 81 ++++++++ .../color_child_tab_etiological_result.xml | 6 - .../color/color_child_tab_record_physique.xml | 6 - .../res/drawable/bg_child_tab_layout_item.xml | 2 +- app/src/main/res/drawable/rect_line_blue.xml | 11 + app/src/main/res/drawable/rect_line_green.xml | 11 + app/src/main/res/layout/activity_bank.xml | 1 + app/src/main/res/layout/fragment_home.xml | 4 + .../main/res/layout/fragment_item_watch.xml | 196 ++++++++++++++++++ .../res/layout/item_tablayout_group_title.xml | 28 ++- .../layout/item_tablayout_group_title2.xml | 14 -- .../res/layout/layout_home_item_watch.xml | 108 ++++++++++ .../res/mipmap-xhdpi/ic_home_watch_tab1.png | Bin 0 -> 1864 bytes .../res/mipmap-xhdpi/ic_home_watch_tab2.png | Bin 0 -> 1645 bytes .../res/mipmap-xhdpi/ic_home_watch_tab3.png | Bin 0 -> 1682 bytes .../res/mipmap-xhdpi/ic_home_watch_tab4.png | Bin 0 -> 2024 bytes .../res/mipmap-xhdpi/ic_home_watch_tab5.png | Bin 0 -> 1600 bytes 26 files changed, 720 insertions(+), 53 deletions(-) create mode 100644 app/src/main/java/com/xjjk/healthyclients/bean/home/HomeWatchBean.kt create mode 100644 app/src/main/java/com/xjjk/healthyclients/event/WatchDataChangeEvent.kt create mode 100644 app/src/main/java/com/xjjk/healthyclients/fragment/WatchItemFragment.kt create mode 100644 app/src/main/java/com/xjjk/healthyclients/view/HomeWatchView.kt delete mode 100644 app/src/main/res/color/color_child_tab_etiological_result.xml delete mode 100644 app/src/main/res/color/color_child_tab_record_physique.xml create mode 100644 app/src/main/res/drawable/rect_line_blue.xml create mode 100644 app/src/main/res/drawable/rect_line_green.xml create mode 100644 app/src/main/res/layout/fragment_item_watch.xml delete mode 100644 app/src/main/res/layout/item_tablayout_group_title2.xml create mode 100644 app/src/main/res/layout/layout_home_item_watch.xml create mode 100644 app/src/main/res/mipmap-xhdpi/ic_home_watch_tab1.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_home_watch_tab2.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_home_watch_tab3.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_home_watch_tab4.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_home_watch_tab5.png diff --git a/app/src/main/java/com/xjjk/healthyclients/bean/home/HomeWatchBean.kt b/app/src/main/java/com/xjjk/healthyclients/bean/home/HomeWatchBean.kt new file mode 100644 index 0000000..e9d6678 --- /dev/null +++ b/app/src/main/java/com/xjjk/healthyclients/bean/home/HomeWatchBean.kt @@ -0,0 +1,25 @@ +package com.xjjk.healthyclients.bean.home + + +/** + * 首页-手表数据 + */ +class HomeWatchAllDataBean { + var name: String? = null + var latest: String? = null + var max: String? = null + var min: String? = null + var avg: String? = null + var type: Int? = null + + var latestTime: String? = null +} + + +data class WatchInfoBean( + val bindDate: String, + val hasWatch: Boolean, + val lastUploadDate: String, + val watchModel: String, + val watchNo: String +) diff --git a/app/src/main/java/com/xjjk/healthyclients/data/api/HomeApi.kt b/app/src/main/java/com/xjjk/healthyclients/data/api/HomeApi.kt index ec8b09e..f49b2bc 100644 --- a/app/src/main/java/com/xjjk/healthyclients/data/api/HomeApi.kt +++ b/app/src/main/java/com/xjjk/healthyclients/data/api/HomeApi.kt @@ -2,6 +2,8 @@ package com.xjjk.healthyclients.data.api import com.xjjk.healthyclients.bean.home.HomeBannerBean import com.xjjk.healthyclients.bean.home.HomeNoticeBean +import com.xjjk.healthyclients.bean.home.HomeWatchAllDataBean +import com.xjjk.healthyclients.bean.home.WatchInfoBean import com.xjjk.healthyclients.bean.user.CheckInBean import com.xjjk.healthyclients.bean.user.PointDetailBean import com.xjjk.healthyclients.bean.user.PointRank @@ -71,4 +73,17 @@ interface HomeApi { @GET("/health-consultation/consultation/conSession/getPicUrl") suspend fun getConSessionPicUrl(@QueryMap params: MutableMap): ApiResponse + /** + * 首页-用户手表数据 + */ + @GET("/health-watch/api/watchData/userWatchDataAll") + suspend fun getHomeWatchData(@QueryMap params: MutableMap): ApiResponse> + + /** + * 首页-用户是否有手表 + */ + @GET("/health-watch/api/watchData/findWatchInfo") + suspend fun getHomeWatchInfo(@QueryMap params: MutableMap): ApiResponse + + } \ No newline at end of file diff --git a/app/src/main/java/com/xjjk/healthyclients/data/repository/HomeRepository.kt b/app/src/main/java/com/xjjk/healthyclients/data/repository/HomeRepository.kt index 60a405b..fe22256 100644 --- a/app/src/main/java/com/xjjk/healthyclients/data/repository/HomeRepository.kt +++ b/app/src/main/java/com/xjjk/healthyclients/data/repository/HomeRepository.kt @@ -3,6 +3,8 @@ package com.xjjk.healthyclients.data.repository import com.xjjk.healthyclients.base.repository.BaseRepository import com.xjjk.healthyclients.bean.home.HomeBannerBean import com.xjjk.healthyclients.bean.home.HomeNoticeBean +import com.xjjk.healthyclients.bean.home.HomeWatchAllDataBean +import com.xjjk.healthyclients.bean.home.WatchInfoBean import com.xjjk.healthyclients.bean.user.CheckInBean import com.xjjk.healthyclients.bean.user.PointDetailBean import com.xjjk.healthyclients.bean.user.PointRank @@ -80,4 +82,22 @@ object HomeRepository : BaseRepository() { val map = mutableMapOf() return apiCall { service.getConSessionPicUrl(map) } } + /** + * 首页-用户手表数据 + */ + suspend fun getHomeWatchData(date:String): ApiResponse> { + return apiCall { + val map = mutableMapOf() + map["date"] = date + service.getHomeWatchData(map) + } + } + + suspend fun getHomeWatchInfo(userId: String?): ApiResponse { + return apiCall { + val map = mutableMapOf() + map["userId"] = userId + service.getHomeWatchInfo(map) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/xjjk/healthyclients/event/WatchDataChangeEvent.kt b/app/src/main/java/com/xjjk/healthyclients/event/WatchDataChangeEvent.kt new file mode 100644 index 0000000..02dd874 --- /dev/null +++ b/app/src/main/java/com/xjjk/healthyclients/event/WatchDataChangeEvent.kt @@ -0,0 +1,12 @@ +package com.xjjk.healthyclients.event + +import com.xjjk.healthyclients.bean.home.HomeWatchAllDataBean + +/** + * 手表数据变更事件 + * 用于 HomeWatchView → WatchItemFragment 的数据通知 + * @param dataList 接口返回的手表各项健康数据列表(按索引对应各 Tab) + */ +class WatchDataChangeEvent { + var dataList: MutableList? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/xjjk/healthyclients/fragment/HomeFragment.kt b/app/src/main/java/com/xjjk/healthyclients/fragment/HomeFragment.kt index 330d213..cb5a3c1 100644 --- a/app/src/main/java/com/xjjk/healthyclients/fragment/HomeFragment.kt +++ b/app/src/main/java/com/xjjk/healthyclients/fragment/HomeFragment.kt @@ -9,6 +9,7 @@ import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import com.sw.healthyclients.data.local.DataStoreManager +import com.sw.healthyclients.utils.DateUtil import com.tencent.qcloud.tuikit.tuichat.bean.WorkBean import com.xjjk.healthyclients.R import com.xjjk.healthyclients.adapter.common.MultiItemTypeAdapter @@ -23,6 +24,7 @@ import com.xjjk.healthyclients.superfuntion.startGroupChat import com.xjjk.healthyclients.superfuntion.startLoginActivity import com.xjjk.healthyclients.superfuntion.startMyGuidanceActivity import com.xjjk.healthyclients.ui.activity.EmptyActivity +import com.xjjk.healthyclients.ui.activity.LoginActivity import com.xjjk.healthyclients.ui.activity.guidance.adapter.GuidanceFragmentDoctorAdapter import com.xjjk.healthyclients.ui.activity.home.HomeBannerDetailActivity import com.xjjk.healthyclients.ui.activity.home.HomeNoticeListActivity @@ -111,7 +113,7 @@ class HomeFragment : }) mBinding.layoutItem3.fragmentGuidanceRvDoctor.adapter = mGuidanceFragmentDoctorAdapter - + mBinding.watchView.init(this@HomeFragment) } override fun bindEvent() { @@ -128,6 +130,13 @@ class HomeFragment : layoutItem1.homeHeadTab4, layoutItem3.tvDoctorMore ) } + mBinding.watchView.mBinding.layoutWatchMore.setOnClickListener{ + if (DataStoreManager.isLogin()) { + EventBus.getDefault().post(HomeTabChangeEvent().apply { index = 3 }) + } else { + toActivity(LoginActivity::class.java) + } + } } override fun onClick(v: View?) { @@ -297,23 +306,41 @@ class HomeFragment : } } } + lifecycleScope.launch{ + repeatOnLifecycle(Lifecycle.State.CREATED){ + mViewModel.watchInfo.collectLatest { bean -> + mBinding.watchView.setWatchInfo(bean) + if (bean?.hasWatch==true) {//有手表的情况下去获取手表数据 + mViewModel.getHomeWatchData(DateUtil.nowStringDateShort) + } + } + } + } + + lifecycleScope.launch{ + repeatOnLifecycle(Lifecycle.State.CREATED){ + mViewModel.watchAllData.collectLatest { bean -> + mBinding.watchView.setWatchAllData(bean) + } + } + } } override fun initData() { mViewModel.getHomeBannerList() - if (ConstantUtils.mCheckToken) { - mViewModel.selectDoctorRecommendHome() - } + mViewModel.selectDoctorRecommendHome() + if (DataStoreManager.isLogin()) { homeNoticeStartRepeat() + mViewModel.getHomeWatchInfo(DataStoreManager.getUserId()) } } private fun homeNoticeStartRepeat() { lifecycleScope.launch { - repeat(100) { + repeat(500) { mViewModel.getHomeNoticeListRepeat() delay(noticeTime) } @@ -329,6 +356,7 @@ class HomeFragment : } if (DataStoreManager.isLogin()) { mViewModel.getHomeNoticeListRepeat() + mViewModel.getHomeWatchInfo(DataStoreManager.getUserId()) } } diff --git a/app/src/main/java/com/xjjk/healthyclients/fragment/WatchItemFragment.kt b/app/src/main/java/com/xjjk/healthyclients/fragment/WatchItemFragment.kt new file mode 100644 index 0000000..ee8ae5a --- /dev/null +++ b/app/src/main/java/com/xjjk/healthyclients/fragment/WatchItemFragment.kt @@ -0,0 +1,144 @@ +package com.xjjk.healthyclients.fragment + +import android.os.Bundle +import android.text.TextUtils +import android.view.View +import androidx.fragment.app.Fragment +import com.sw.healthyclients.utils.DateUtil +import com.xjjk.healthyclients.R +import com.xjjk.healthyclients.base.BaseVMBFragment +import com.xjjk.healthyclients.bean.home.HomeWatchAllDataBean +import com.xjjk.healthyclients.databinding.FragmentItemWatchBinding +import com.xjjk.healthyclients.event.WatchDataChangeEvent +import com.xjjk.healthyclients.superfuntion.orEmptyDefault +import com.xjjk.healthyclients.ui.viewmodel.HomeViewModel + +/** + * 手表item + * 数据类型:0=心率 1=血氧 2=压力 3=体温 4=睡眠 + */ +class WatchItemFragment : + BaseVMBFragment(R.layout.fragment_item_watch) { + var position: Int? = -1 + + fun newInstance(position: Int): Fragment { + val args = Bundle() + args.putInt("position", position) + val fragment = WatchItemFragment() + fragment.arguments = args + return fragment + } + + override fun initView(root: View?, savedInstanceState: Bundle?) { + position = arguments?.getInt("position") + mBinding.watchTypeImg.setImageResource(getWatchTypeImg(position)) + + if (position != 4) { + mBinding.watchType.text = "" + mBinding.watchType.getText() + getWatchTypeText(position) + mBinding.watchLeftText.text = getWatchTypeText(position) +"范围" + mBinding.watchRightText.text = "平均"+getWatchTypeText(position) + + } else { + mBinding.watchType.text = "睡眠总时长" + mBinding.watchLeftText.text = "深睡时长" + mBinding.watchRightText.text = "浅睡时长" + } + + + mBinding.watchValueUnit.text = getWatchUnitText(position) + mBinding.watchLeftUnit.text = getWatchUnitText(position) + mBinding.watchRightUnit.text = getWatchUnitText(position) + + refreshWatchData(null) + + } + + override fun bindEvent() { + } + + override fun onClick(v: View?) { + } + + /** + * 接收手表数据变更事件,按当前 Tab position 取出对应数据并刷新界面 + */ + override fun onMessageEvent(event: Any?) { + super.onMessageEvent(event) + if (event is WatchDataChangeEvent) { + event.dataList?.sortBy { it.type } + val bean = event.dataList?.getOrNull(position ?: -1) + refreshWatchData(bean) + } + } + + /** + * 将接口数据填充到各 UI 控件 + * @param bean 当前 Tab 对应的一条手表健康数据 + */ + private fun refreshWatchData(bean: HomeWatchAllDataBean?) { + // 采集时间 + mBinding.watchTime.text = bean?.latestTime.orEmptyDefault() + + if (position != 4) { + // 最新值 + 单位 + mBinding.watchValue.text = bean?.latest.orEmptyDefault() + // 范围:min ~ max + if (TextUtils.isEmpty(bean?.min)) { + mBinding.watchLeftValue.text = "--" + } else { + mBinding.watchLeftValue.text = "${bean?.min.orEmptyDefault()}-${bean?.max.orEmptyDefault()}" + } + // 平均值 + mBinding.watchRightValue.text = bean?.avg.orEmptyDefault() + } else { + //睡眠数据单独处理 + if (bean == null) { + mBinding.watchValue.text = "--" + mBinding.watchLeftValue.text = "--" + mBinding.watchRightValue.text = "--" + + } else { + mBinding.watchValue.text = + DateUtil.timeDiff(bean.latest!!.toLong() * 1000 * 60).orEmptyDefault() + mBinding.watchLeftValue.text = + DateUtil.timeDiff(bean.max!!.toLong() * 1000 * 60).orEmptyDefault() + mBinding.watchRightValue.text = + DateUtil.timeDiff(bean.min!!.toLong() * 1000 * 60).orEmptyDefault() + + } + } + } + + private fun getWatchTypeImg(type: Int?): Int { + return when (type) { + 0 -> R.mipmap.ic_home_watch_tab1 + 1 -> R.mipmap.ic_home_watch_tab2 + 2 -> R.mipmap.ic_home_watch_tab3 + 3 -> R.mipmap.ic_home_watch_tab4 + 4 -> R.mipmap.ic_home_watch_tab5 + else -> R.mipmap.ic_home_watch_tab1 + } + } + + private fun getWatchTypeText(type: Int?): String { + return when (type) { + 0 -> "心率" + 1 -> "血氧" + 2 -> "压力" + 3 -> "体温" + else -> "" + } + } + + private fun getWatchUnitText(type: Int?): String { + return when (type) { + 0 -> "次/分钟" + 1 -> "%" + 2 -> "" + 3 -> "℃" + + else -> "" + } + } +} + diff --git a/app/src/main/java/com/xjjk/healthyclients/superfuntion/ViewExt.kt b/app/src/main/java/com/xjjk/healthyclients/superfuntion/ViewExt.kt index 7a49fd5..094d3f9 100644 --- a/app/src/main/java/com/xjjk/healthyclients/superfuntion/ViewExt.kt +++ b/app/src/main/java/com/xjjk/healthyclients/superfuntion/ViewExt.kt @@ -11,6 +11,7 @@ import android.view.View import android.view.ViewGroup import android.view.Window import android.widget.ImageView +import android.widget.RelativeLayout import android.widget.TextView import androidx.annotation.DrawableRes import androidx.appcompat.app.AppCompatActivity @@ -523,7 +524,7 @@ fun ViewPager2.init( */ fun TabLayout.onCreateTab( tabList: Array, - tabStyle: Int = 2, + tabStyle: Int = 1, listener: (TabLayout.Tab?) -> Unit ) { for (tabTitle in tabList) { @@ -547,11 +548,12 @@ fun TabLayout.onCreateTab( } -private fun onConfigureTab(context: Context, tab: TabLayout.Tab, tabTitle: String, tabStyle: Int) { - val textView = LayoutInflater.from(context) - .inflate(getTabStyle(tabStyle), null) as TextView - textView.text = tabTitle - tab.customView = textView +private fun onConfigureTab(context: Context,tab: TabLayout.Tab, tabTitle: String,tabStyle: Int) { + val tabView = LayoutInflater.from(context) + .inflate(getTabStyle(tabStyle), null) as RelativeLayout + val tabText = tabView.findViewById(R.id.tv_text) + tabText.text = tabTitle + tab.customView = tabView } @@ -583,13 +585,11 @@ fun TabLayout.attachViewPager( /** * tab 样式 - * 1:通用样式 2:癌症结论tab样式 + * 1:通用样式 绿色/灰色 */ fun getTabStyle(i: Int): Int { return when (i) { 1 -> R.layout.item_tablayout_group_title - 2 -> R.layout.item_tablayout_group_title2 - 102 -> R.layout.item_home_tab_group//首页 else -> R.layout.item_tablayout_group_title } } diff --git a/app/src/main/java/com/xjjk/healthyclients/ui/activity/InterventionWebActivity.kt b/app/src/main/java/com/xjjk/healthyclients/ui/activity/InterventionWebActivity.kt index adfb97c..9af2445 100644 --- a/app/src/main/java/com/xjjk/healthyclients/ui/activity/InterventionWebActivity.kt +++ b/app/src/main/java/com/xjjk/healthyclients/ui/activity/InterventionWebActivity.kt @@ -3,6 +3,7 @@ package com.xjjk.healthyclients.ui.activity import android.graphics.Bitmap import android.os.Bundle import android.text.TextUtils +import android.util.Log import android.view.View import android.webkit.WebChromeClient import android.webkit.WebView @@ -109,6 +110,7 @@ class InterventionWebActivity() : // Log.e("mzf","file:///android_asset/dist/index.html?p=$path&r=${url}&t=${mToken}&id=${mUserId}&d=${date}") // Log.e("mzf", "$localAdress&d=${date}") mBinding.webView.loadUrl("$localAdress&d=${date}&h=${urlType}") + Log.i("InterventionWebActivity", "url: "+mBinding.webView.url) } private fun getTitleText(path: String?): String { diff --git a/app/src/main/java/com/xjjk/healthyclients/ui/viewmodel/HomeViewModel.kt b/app/src/main/java/com/xjjk/healthyclients/ui/viewmodel/HomeViewModel.kt index c87a35a..e9a7e0a 100644 --- a/app/src/main/java/com/xjjk/healthyclients/ui/viewmodel/HomeViewModel.kt +++ b/app/src/main/java/com/xjjk/healthyclients/ui/viewmodel/HomeViewModel.kt @@ -4,6 +4,8 @@ import com.xjjk.healthyclients.base.viewmodel.BaseViewModel import com.xjjk.healthyclients.bean.guidance.GuidanceListBean import com.xjjk.healthyclients.bean.home.HomeBannerBean import com.xjjk.healthyclients.bean.home.HomeNoticeBean +import com.xjjk.healthyclients.bean.home.HomeWatchAllDataBean +import com.xjjk.healthyclients.bean.home.WatchInfoBean import com.xjjk.healthyclients.data.repository.GuidanceRepository import com.xjjk.healthyclients.data.repository.HomeRepository import com.xjjk.healthyclients.superfuntion.handleRequest @@ -21,6 +23,10 @@ class HomeViewModel : BaseViewModel() { var homeBannerList = MutableSharedFlow?>() var sessionPicUrl = MutableSharedFlow() + //手表 + var watchInfo = MutableSharedFlow() + var watchAllData = MutableSharedFlow?>() + var isRefreshing = MutableStateFlow(false) var isLoadMoreEnd = MutableSharedFlow() @@ -34,7 +40,6 @@ class HomeViewModel : BaseViewModel() { fun selectDoctorRecommendHome() { launch( { - handleRequest( GuidanceRepository.selectDoctorRecommend(1,3), successBlock = { @@ -135,5 +140,29 @@ class HomeViewModel : BaseViewModel() { ) } + fun getHomeWatchData(date:String) { + launch( + { + handleRequest( + HomeRepository.getHomeWatchData(date), + successBlock = { + watchAllData.emit(it.result) + }) + } + ) + } + + fun getHomeWatchInfo(userId: String?) { + launch( + { + handleRequest( + HomeRepository.getHomeWatchInfo(userId), + successBlock = { + watchInfo.emit(it.result) + }) + } + ) + } + } \ No newline at end of file diff --git a/app/src/main/java/com/xjjk/healthyclients/view/HomeWatchView.kt b/app/src/main/java/com/xjjk/healthyclients/view/HomeWatchView.kt new file mode 100644 index 0000000..a03deb3 --- /dev/null +++ b/app/src/main/java/com/xjjk/healthyclients/view/HomeWatchView.kt @@ -0,0 +1,81 @@ +package com.xjjk.healthyclients.view + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import android.widget.RelativeLayout +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.Fragment +import com.sw.healthyclients.adapter.common.ViewPagerAdapter +import com.sw.healthyclients.bean.common.TabItemBean +import com.xjjk.healthyclients.R +import com.xjjk.healthyclients.bean.home.HomeWatchAllDataBean +import com.xjjk.healthyclients.bean.home.WatchInfoBean +import com.xjjk.healthyclients.databinding.LayoutHomeItemWatchBinding +import com.xjjk.healthyclients.event.WatchDataChangeEvent +import com.xjjk.healthyclients.fragment.WatchItemFragment +import com.xjjk.healthyclients.superfuntion.init +import com.xjjk.healthyclients.superfuntion.onCreateTab +import org.greenrobot.eventbus.EventBus + +class HomeWatchView(context: Context?, attrs: AttributeSet?) : + RelativeLayout(context, attrs, 0), ViewPagerAdapter.OnCreateFragmentListener { + + var mContext: Context? = context + var mBinding: LayoutHomeItemWatchBinding = DataBindingUtil.inflate( + LayoutInflater.from(context), + R.layout.layout_home_item_watch, this, true + ) + + + fun init(fragment: Fragment) { + val arrayOf = arrayOf("心脑血管", "癌症", "慢呼", "糖尿病", "亚健康") + mBinding.watchTabLayout.onCreateTab(arrayOf, 1) {tab-> + if (tab?.position != 0) { + mBinding.emptyText.visibility = View.VISIBLE + mBinding.emptyText.text = "开发中" + mBinding.viewPager.visibility = View.GONE + } else { + mBinding.viewPager.visibility = View.VISIBLE + mBinding.emptyText.visibility = View.GONE + } + + } + + val tabList: MutableList = mutableListOf() + (0..4).forEach { _ -> + tabList.add(TabItemBean()) + } + mBinding.viewPager.init(fragment, tabList.toTypedArray(), this, 5) + } + + fun setWatchInfo(watchInfo: WatchInfoBean?) { + if (watchInfo?.hasWatch == true) { + mBinding.viewPager.visibility = View.VISIBLE + mBinding.watchName.visibility = View.VISIBLE + mBinding.emptyText.visibility = View.GONE + mBinding.watchName.text = "监测工具编码:${watchInfo.watchNo}" + } else { + mBinding.viewPager.visibility = View.GONE + mBinding.watchName.visibility = View.GONE + mBinding.emptyText.visibility = View.VISIBLE + mBinding.emptyText.text = "您目前未配备智能穿戴设备" + } + } + + /** + * 接收手表详细数据并通过 EventBus 通知各 WatchItemFragment 刷新 + * @param dataList 接口返回的手表各项健康数据列表(索引与 Tab position 对应) + */ + fun setWatchAllData(dataList: MutableList?) { + EventBus.getDefault().post(WatchDataChangeEvent().apply { + this.dataList = dataList + }) + } + + override fun createFragment(position: Int): Fragment { + return WatchItemFragment().newInstance(position) + } + +} \ No newline at end of file diff --git a/app/src/main/res/color/color_child_tab_etiological_result.xml b/app/src/main/res/color/color_child_tab_etiological_result.xml deleted file mode 100644 index 8b5accf..0000000 --- a/app/src/main/res/color/color_child_tab_etiological_result.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/color/color_child_tab_record_physique.xml b/app/src/main/res/color/color_child_tab_record_physique.xml deleted file mode 100644 index abaf6a7..0000000 --- a/app/src/main/res/color/color_child_tab_record_physique.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_child_tab_layout_item.xml b/app/src/main/res/drawable/bg_child_tab_layout_item.xml index 6508d03..598a976 100644 --- a/app/src/main/res/drawable/bg_child_tab_layout_item.xml +++ b/app/src/main/res/drawable/bg_child_tab_layout_item.xml @@ -4,5 +4,5 @@ - + \ No newline at end of file diff --git a/app/src/main/res/drawable/rect_line_blue.xml b/app/src/main/res/drawable/rect_line_blue.xml new file mode 100644 index 0000000..22ba7e1 --- /dev/null +++ b/app/src/main/res/drawable/rect_line_blue.xml @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/rect_line_green.xml b/app/src/main/res/drawable/rect_line_green.xml new file mode 100644 index 0000000..22b1842 --- /dev/null +++ b/app/src/main/res/drawable/rect_line_green.xml @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_bank.xml b/app/src/main/res/layout/activity_bank.xml index a2a79ca..ccd918a 100644 --- a/app/src/main/res/layout/activity_bank.xml +++ b/app/src/main/res/layout/activity_bank.xml @@ -88,6 +88,7 @@ android:layout_width="match_parent" android:layout_height="5dp" android:background="@drawable/imaginary_line"/> + diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index c26e832..d3e2df2 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -111,6 +111,10 @@ android:layout_height="60dp" android:layout_marginHorizontal="12dp" android:layout_marginTop="10dp" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_tablayout_group_title.xml b/app/src/main/res/layout/item_tablayout_group_title.xml index 80831e1..65a0a77 100644 --- a/app/src/main/res/layout/item_tablayout_group_title.xml +++ b/app/src/main/res/layout/item_tablayout_group_title.xml @@ -1,13 +1,19 @@ - - \ No newline at end of file + android:layout_height="wrap_content"> + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_tablayout_group_title2.xml b/app/src/main/res/layout/item_tablayout_group_title2.xml deleted file mode 100644 index 7803ec8..0000000 --- a/app/src/main/res/layout/item_tablayout_group_title2.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/layout_home_item_watch.xml b/app/src/main/res/layout/layout_home_item_watch.xml new file mode 100644 index 0000000..31abe52 --- /dev/null +++ b/app/src/main/res/layout/layout_home_item_watch.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-xhdpi/ic_home_watch_tab1.png b/app/src/main/res/mipmap-xhdpi/ic_home_watch_tab1.png new file mode 100644 index 0000000000000000000000000000000000000000..d44254a2fbb11a5aba9b81de31ccb7a473293128 GIT binary patch literal 1864 zcmV-O2ePx+0!c(cRCr$PTWgG6RTcieefFJBr=y)2#yU2{2cnn=T0v7aCZH12@(QULp#IQ^ zFxG0(iixoaI)TacP=ycp0hvQ zr*p^KnL9J*>~q_BT+hF`XMJn0_3gFxS$ogg#5|8K8n#D!j&^sL%1Xo?oKJpHyth?V zUDvBUM|;YAcsQQRrdb^lz>$sHUej4p_o8qr(1`IG%YFNH9w(q?Dw-1DXT98eu+Jpc z29CR^U@nT|?$LpfX3;Q%01XY5#tzssXpLD^UKBJ&v2&}=j9=ldUA0D4ClTOheyrl8lI-ZFMn{jz9vi&@XE$*uU+a3URLJ) z!g$8MoyWX?DC=h zh#eg*BzDQDN>r_~e96{<^XgK_%-eaq53QkRXT>i}#9@Q!)#G08h?bT@a(BpJql+m*vCElrBs_415IAk3$V1@Qi?W2jZWKjjk*b355u7iCgUq{|I2= z>ImT`Yj{T>fha^kSm=hDIxFsYqUhWe#?5*7IUBkd0n&W{-q&)M@+pU|qxu z7W{AsKA3<+I$vpFQtWXu>pF}M7a{;SR8n%jjBR@MKbM8U1jLSKg6{ER?qkG~=Xo8m z^eBM02I|{y$&ZC#g9)IES!47BfPstyKL_F8AlBFA1wK+DKH>jPm{Hd>F+O04 zp%82^0jbeWyG3NoJzipoXBtDD)K?;yd%UiibDt#noe(DgY`5gSA=p9$#J~`wZ)6zw zSfc1W|E-QCU;m#Cz!7|BM5M>l1s2r`!3*koGT3sGNFf5!+=U*3@bfL~kkGiek75Bh2@c6t`X>Re6`w^{JpxiAgFK?GFc-fx6~G^fF>AU-&U0WVte zL+NhO@g+owh0I=&SCxRrCR5@mOI{vJw*%Oa#~BG1lnf8%!8FPS5s>GT)$pBv3BX@1 z`O#QM|K3Slx?K_OTICya9ysY5l~l} zNIwy9(HzG3b;Ea{oYaLvVN+!Icr5wP+NY-D{rkiwPtT^e!`Z3zCo2)BgaAKy?DTyQ zS7bG0GF`sw$R{aHuj(cQ+)yI-=Fyi$_LLD2NP=JSqZx)fZmI$jdr!4~N1J;~7m*Bn4c6|hX z9+5ZXb)ty;X(zxNTLacodH}$hDdWkzE%3D>&V*nWgaB`7HFj%E#NPqF)YWcF^VJXs zieeVDLBgK`MdHN~d0SCOg7CgUqU~E`+P+Du?c3zqzERS*$yYWF4YXaSm~WN+#jb<@ zZ`fwC$y-dMUYFZ;my) zG3I@4esOYeFe;Y^`j*QLGUvm-```%o>}m2}rdf6oQ&(qKPOMt8HG-{b{M8j>xv$PP za-zY(XcWEOD-v`q86s>|6A>!C7%exO^+x|P-v;*)fx+#aqZsS3<0$!i#q5l^;H229 zG;ZZDM8=({^Px*CrLy>RCr$PTWf3-RTTcty|devQUobbw1|m-AV$HGfDu$Q%0DDgBEf3X2-K)S zF%S~`(;p;0;sc{mi7}V}AwV$lGXBs&5E11W6D2VPMM!vvX|*h+yK~RcyWK(`l$o90 zU0T-p(`M(KZ@%;0b7#)nIhPRj5TVNNHx|d^4RH^Mc^vmddBhi!6c!>EcB(io#J>0{ z>H9z`nH-cndGG9tAd)cG3nc&GjykUqBm1|Mc_r66*f0TE8!JjtlixfL$ItJaUguxU zuX_PRXw(mD%VM6C_Laap2Wo{#`IM-i{8UqS8F57c?5LmAw+zxsVqsP9&31+ABr?8u)j9a(<81>Y916=7)N z___9(a9IF5=f7Q5e!Zl9cNt=*L;bXxb8Yv8O9G7AyJmp)Tl#04T7A*pctz*yr&RxA zxu*rNseh*Iwjq7>ZlCQS*r&s=rlWt_sgM?6!j4q~n`7KBTcEydUy@Q64o|OXB#6+s z18XV@W%Szy&1S)os_N5Jxo1O3DK`!3%cB{UdqR~pP$8y&n_zYt(3t%z%ju#QkE&u{ z_LE{iNq79Xs^WSre1ZnY7DhB~|LWn_;s&V2^WbqU1mhLt%@oV;L4;kOPrpjvzWdXg zTmy%}(^}00@KLL+9Ac&CNXkDS#@D6IH4(sz(O6;nreh$o!5CTOGPp2Uc^5#D#Gv#R z0`BTePzaB*&p(GD?#d?b0%%V?1Ho(E1n`RxX0gu+R{;j$_8a*_ct z(j}~94}hW0NQ*pYShhOD%K+s>0PWFS2)$uH)H)=5!Wf?75HAhoUVvDvNVEA0z!;Zg z2{3>x@lCWxYIj_m3!s!YnTYM9&-r2N0qx14NZ1p?W)OzEA`IZDF?_!(Jf{LEO^*@i!`4id`E2A%t<@F)RjvpN zXd4?->k7}Q0HoAlMfj<;#KK17^UF%>YJ%9R(ADv(G5nb;FsA}oQd+C;0NiT-H->M{ z{B{_?5GSM=6OHg$Cs?^Cg|$-mfv_P%@O@+Wb?wnZ5L(@1(u7?|sizIuu2?sR`wU2b z^pv%kHNb=tnUjP*q{-AMP@MoeBK4FIo@JjqeNu~vmT_|~fW?h@`c4*X0>pNmodsm3 zUEI_j&4AEL0PfC~wg8{7;ks=7g6wl5KxW?0|L<=b;p2cjX+?+^QL*pS0tGA%pAA%R zjCmj^m?-CSCO}#QPrnGklFX;D1cBCp_+8(ZMy+WZKodb!E0AUqd;nlTmmmm-88lCP zb1F)JK|VQeknl7;BA}H3iZW!*0QeffTzeBHlJSN~D@y;?c?D@J0}I7)GANKJ=hF=m z`Dl^R%BvLOc?47gDCtO+d_e3cu=c+n6j94#D!H%4R~#j{Fh1!PnS3@$Y2^(gGLH+C zozE43*yhX|(}g4O8$btzWIOx3D@*`AwMjQg6?~gq!8b}4e5W|6KMqseanp1ps+VhWvYsT-Zs}(Srzog$xG#BA#a^+Ut<^U=IPFF8kz0$S# r3uQ^KH*TNr*A(~96_vJRvwi+wGV$yAgfy>g00000NkvXXu0mjfmiYc< literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/ic_home_watch_tab3.png b/app/src/main/res/mipmap-xhdpi/ic_home_watch_tab3.png new file mode 100644 index 0000000000000000000000000000000000000000..349382d4e01f940b3e8d8e23adcf4b50b088a9f8 GIT binary patch literal 1682 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