fix(home): 修复手表数据展示逻辑并优化首页手表模块

- WatchItemFragment 按 position 细化数据展示分支,补全各字段空值判断
- floatToInt() 改用 roundToInt() 避免数值截断误差
- HomeWatchView 新增 ViewPager2 5s 自动轮播,回首页禁用滑动动画,销毁时防内存泄漏
- 首页手表卡片空状态样式调整(高度 45→163dp,字号 12→15sp)
- 首页头像图片由 jpg 替换为 png

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
zhanglei
2026-03-05 17:31:13 +08:00
co-authored by Claude Sonnet 4.6
parent 53f33b35e0
commit dcb53f344a
6 changed files with 106 additions and 19 deletions
@@ -10,6 +10,7 @@ import com.xjjk.healthyclients.base.BaseVMBFragment
import com.xjjk.healthyclients.bean.home.HomeWatchAllDataBean import com.xjjk.healthyclients.bean.home.HomeWatchAllDataBean
import com.xjjk.healthyclients.databinding.FragmentItemWatchBinding import com.xjjk.healthyclients.databinding.FragmentItemWatchBinding
import com.xjjk.healthyclients.event.WatchDataChangeEvent import com.xjjk.healthyclients.event.WatchDataChangeEvent
import com.xjjk.healthyclients.superfuntion.floatToInt
import com.xjjk.healthyclients.superfuntion.orEmptyDefault import com.xjjk.healthyclients.superfuntion.orEmptyDefault
import com.xjjk.healthyclients.ui.viewmodel.HomeViewModel import com.xjjk.healthyclients.ui.viewmodel.HomeViewModel
@@ -35,8 +36,8 @@ class WatchItemFragment :
if (position != 4) { if (position != 4) {
mBinding.watchType.text = "" + mBinding.watchType.getText() + getWatchTypeText(position) mBinding.watchType.text = "" + mBinding.watchType.getText() + getWatchTypeText(position)
mBinding.watchLeftText.text = getWatchTypeText(position) +"范围" mBinding.watchLeftText.text = getWatchTypeText(position) + "范围"
mBinding.watchRightText.text = "平均"+getWatchTypeText(position) mBinding.watchRightText.text = "平均" + getWatchTypeText(position)
} else { } else {
mBinding.watchType.text = "睡眠总时长" mBinding.watchType.text = "睡眠总时长"
@@ -79,31 +80,71 @@ class WatchItemFragment :
// 采集时间 // 采集时间
mBinding.watchTime.text = bean?.latestTime.orEmptyDefault() mBinding.watchTime.text = bean?.latestTime.orEmptyDefault()
if (position != 4) { if (position == 1 || position == 2 || position == 0) {
// 最新值 + 单位
if (TextUtils.isEmpty(bean?.latest)) {
mBinding.watchValue.text = "--"
} else {
mBinding.watchValue.text = "${bean?.latest.floatToInt()}"
}
// 范围:min ~ max
if (TextUtils.isEmpty(bean?.min)) {
mBinding.watchLeftValue.text = "--"
} else {
mBinding.watchLeftValue.text =
"${bean?.min.floatToInt()}-${bean?.max.floatToInt()}"
}
// 平均值
if (TextUtils.isEmpty(bean?.avg)) {
mBinding.watchRightValue.text = "--"
} else {
mBinding.watchRightValue.text = "${bean?.avg.floatToInt()}"
}
} else if (position == 3) {
// 最新值 + 单位 // 最新值 + 单位
mBinding.watchValue.text = bean?.latest.orEmptyDefault() mBinding.watchValue.text = bean?.latest.orEmptyDefault()
// 范围:min ~ max // 范围:min ~ max
if (TextUtils.isEmpty(bean?.min)) { if (TextUtils.isEmpty(bean?.min)) {
mBinding.watchLeftValue.text = "--" mBinding.watchLeftValue.text = "--"
} else { } else {
mBinding.watchLeftValue.text = "${bean?.min.orEmptyDefault()}-${bean?.max.orEmptyDefault()}" mBinding.watchLeftValue.text =
"${bean?.min.orEmptyDefault()}-${bean?.max.orEmptyDefault()}"
} }
// 平均值 // 平均值
mBinding.watchRightValue.text = bean?.avg.orEmptyDefault() mBinding.watchRightValue.text = bean?.avg.orEmptyDefault()
} else {
} else if (position == 4) {
//睡眠数据单独处理 //睡眠数据单独处理
if (bean == null) { if (bean == null) {
mBinding.watchValue.text = "--" mBinding.watchValue.text = "--"
mBinding.watchLeftValue.text = "--" mBinding.watchLeftValue.text = "--"
mBinding.watchRightValue.text = "--" mBinding.watchRightValue.text = "--"
} else {
if (TextUtils.isEmpty(bean.latest)) {
mBinding.watchValue.text = "--"
} else { } else {
mBinding.watchValue.text = mBinding.watchValue.text =
DateUtil.timeDiff(bean.latest!!.toLong() * 1000 * 60).orEmptyDefault() DateUtil.timeDiff(bean.latest!!.floatToInt().toLong() * 1000 * 60)
.orEmptyDefault()
}
if (TextUtils.isEmpty(bean.max)) {
mBinding.watchLeftValue.text = "--"
} else {
mBinding.watchLeftValue.text = mBinding.watchLeftValue.text =
DateUtil.timeDiff(bean.max!!.toLong() * 1000 * 60).orEmptyDefault() DateUtil.timeDiff(bean.max!!.floatToInt().toLong() * 1000 * 60)
.orEmptyDefault()
}
if (TextUtils.isEmpty(bean.min)) {
mBinding.watchRightValue.text = "--"
} else {
mBinding.watchRightValue.text = mBinding.watchRightValue.text =
DateUtil.timeDiff(bean.min!!.toLong() * 1000 * 60).orEmptyDefault() DateUtil.timeDiff(bean.min!!.floatToInt().toLong() * 1000 * 60)
.orEmptyDefault()
}
} }
} }
@@ -126,7 +126,7 @@ fun String?.floatToInt(i: Int = 0): Int {
i i
} else { } else {
if (this!!.toFloatOrNull() != null) { if (this!!.toFloatOrNull() != null) {
this.toFloatOrNull()!!.toInt() this.toFloatOrNull()!!.roundToInt()
} else { } else {
i i
} }
@@ -1,6 +1,8 @@
package com.xjjk.healthyclients.view package com.xjjk.healthyclients.view
import android.content.Context import android.content.Context
import android.os.Handler
import android.os.Looper
import android.util.AttributeSet import android.util.AttributeSet
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
@@ -22,23 +24,49 @@ import org.greenrobot.eventbus.EventBus
class HomeWatchView(context: Context?, attrs: AttributeSet?) : class HomeWatchView(context: Context?, attrs: AttributeSet?) :
RelativeLayout(context, attrs, 0), ViewPagerAdapter.OnCreateFragmentListener { RelativeLayout(context, attrs, 0), ViewPagerAdapter.OnCreateFragmentListener {
companion object {
/** 自动轮播间隔时间(毫秒) */
private const val AUTO_PLAY_INTERVAL = 5000L
}
var mContext: Context? = context var mContext: Context? = context
var mBinding: LayoutHomeItemWatchBinding = DataBindingUtil.inflate( var mBinding: LayoutHomeItemWatchBinding = DataBindingUtil.inflate(
LayoutInflater.from(context), LayoutInflater.from(context),
R.layout.layout_home_item_watch, this, true R.layout.layout_home_item_watch, this, true
) )
/** 自动轮播 Handler */
private val autoPlayHandler = Handler(Looper.getMainLooper())
/** 自动轮播 Runnable,每隔5s循环滚动到下一页 */
private val autoPlayRunnable = object : Runnable {
override fun run() {
val itemCount = mBinding.viewPager.adapter?.itemCount ?: 0
if (itemCount > 0) {
val nextItem = (mBinding.viewPager.currentItem + 1) % itemCount
if (nextItem == 0) {
mBinding.viewPager.setCurrentItem(nextItem, false)
} else {
mBinding.viewPager.setCurrentItem(nextItem, true)
}
}
autoPlayHandler.postDelayed(this, AUTO_PLAY_INTERVAL)
}
}
fun init(fragment: Fragment) { fun init(fragment: Fragment) {
val arrayOf = arrayOf("心脑血管", "癌症", "慢呼", "糖尿病", "亚健康") val arrayOf = arrayOf("心脑血管", "癌症", "慢呼", "糖尿病", "亚健康")
mBinding.watchTabLayout.onCreateTab(arrayOf, 1) {tab-> mBinding.watchTabLayout.onCreateTab(arrayOf, 1) {tab->
if (tab?.position != 0) { if (tab?.position != 0) {
mBinding.emptyText.visibility = View.VISIBLE mBinding.emptyText.visibility = View.VISIBLE
mBinding.emptyText.text = "开发中" mBinding.emptyText.text = "紧急开发中"
mBinding.viewPager.visibility = View.GONE mBinding.viewPager.visibility = View.GONE
stopAutoPlay()
} else { } else {
mBinding.viewPager.visibility = View.VISIBLE mBinding.viewPager.visibility = View.VISIBLE
mBinding.emptyText.visibility = View.GONE mBinding.emptyText.visibility = View.GONE
startAutoPlay()
} }
} }
@@ -48,6 +76,24 @@ class HomeWatchView(context: Context?, attrs: AttributeSet?) :
tabList.add(TabItemBean()) tabList.add(TabItemBean())
} }
mBinding.viewPager.init(fragment, tabList.toTypedArray(), this, 5) mBinding.viewPager.init(fragment, tabList.toTypedArray(), this, 5)
startAutoPlay()
}
/** 启动自动轮播 */
fun startAutoPlay() {
autoPlayHandler.removeCallbacks(autoPlayRunnable)
autoPlayHandler.postDelayed(autoPlayRunnable, AUTO_PLAY_INTERVAL)
}
/** 停止自动轮播 */
fun stopAutoPlay() {
autoPlayHandler.removeCallbacks(autoPlayRunnable)
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
// View 移除时停止轮播,防止内存泄漏
stopAutoPlay()
} }
fun setWatchInfo(watchInfo: WatchInfoBean?) { fun setWatchInfo(watchInfo: WatchInfoBean?) {
Binary file not shown.

Before

Width:  |  Height:  |  Size: 306 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

@@ -35,11 +35,11 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentRight="true" android:layout_alignParentRight="true"
android:layout_marginTop="10dp" android:layout_marginTop="12dp"
android:layout_marginRight="36dp" android:layout_marginRight="36dp"
android:ellipsize="end" android:ellipsize="end"
android:textColor="#14BEBE" android:textColor="#14BEBE"
android:textSize="13sp" android:textSize="12sp"
tools:text="监测工具编码:4PMBB25A28100553" /> tools:text="监测工具编码:4PMBB25A28100553" />
<ImageView <ImageView
@@ -91,14 +91,14 @@
<TextView <TextView
android:id="@+id/empty_text" android:id="@+id/empty_text"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="45dp" android:layout_height="163dp"
android:layout_centerHorizontal="true" android:layout_centerHorizontal="true"
android:layout_marginTop="55dp" android:layout_marginTop="55dp"
android:background="@color/white" android:background="@color/white"
android:gravity="center" android:gravity="center"
android:text="暂未登录" android:text="暂未登录"
android:textColor="#77849E" android:textColor="#77849E"
android:textSize="12sp" /> android:textSize="15sp" />
</com.allen.library.shape.ShapeRelativeLayout> </com.allen.library.shape.ShapeRelativeLayout>