feat:初步实现首页排行榜UI效果
This commit is contained in:
@@ -43,9 +43,6 @@ class HomeViewModel : BaseViewModel() {
|
||||
private val _collectLiveData = MutableLiveData<ListResult<HomeRoomInfo>>()
|
||||
val collectLiveData: LiveData<ListResult<HomeRoomInfo>> = _collectLiveData
|
||||
|
||||
private val _tagLiveData = MutableLiveData<List<HomeTagInfo>>()
|
||||
val tagLiveData: LiveData<List<HomeTagInfo>> = _tagLiveData
|
||||
|
||||
private val _emptyLiveData = MutableLiveData<Boolean>()
|
||||
val emptyLiveData: LiveData<Boolean> = _emptyLiveData
|
||||
|
||||
@@ -124,12 +121,6 @@ class HomeViewModel : BaseViewModel() {
|
||||
)
|
||||
}
|
||||
|
||||
fun getTagInfo() {
|
||||
safeLaunch {
|
||||
_tagLiveData.value = HomeModel.getHomeTag()
|
||||
}
|
||||
}
|
||||
|
||||
fun getGameRoom(pageNum: Int, pageSize: Int) {
|
||||
safeLaunch(
|
||||
onError = {
|
||||
|
@@ -0,0 +1,37 @@
|
||||
package com.chwl.app.home.adapter
|
||||
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.BaseAdapter
|
||||
import com.chwl.app.R
|
||||
|
||||
class HomeRankViewFlipperAdapter : BaseAdapter() {
|
||||
|
||||
private val list = ArrayList<List<String>>()
|
||||
|
||||
fun setNewData(newList: List<List<String>>) {
|
||||
list.clear()
|
||||
list.addAll(newList)
|
||||
notifyDataSetChanged()
|
||||
}
|
||||
|
||||
override fun getCount(): Int {
|
||||
return list.size
|
||||
}
|
||||
|
||||
override fun getItem(position: Int): Any {
|
||||
return list.get(position)
|
||||
}
|
||||
|
||||
override fun getItemId(position: Int): Long {
|
||||
return position.toLong()
|
||||
}
|
||||
|
||||
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
|
||||
val view = convertView ?: LayoutInflater.from(parent.context)
|
||||
.inflate(R.layout.home_recommend_item_rank, parent, false)
|
||||
return view
|
||||
}
|
||||
|
||||
}
|
@@ -15,6 +15,7 @@ import com.chwl.app.base.BaseViewBindingFragment
|
||||
import com.chwl.app.databinding.FragmentHomeRecommendBinding
|
||||
import com.chwl.app.home.HomeViewModel
|
||||
import com.chwl.app.home.adapter.HomeBannerAdapter
|
||||
import com.chwl.app.home.adapter.HomeRankViewFlipperAdapter
|
||||
import com.chwl.app.home.dialog.RecommendRoomDialog
|
||||
import com.chwl.app.support.FragmentVisibleStateHelper
|
||||
import com.chwl.app.ui.search.SearchActivity
|
||||
@@ -46,10 +47,14 @@ class HomeRecommendFragment : BaseViewBindingFragment<FragmentHomeRecommendBindi
|
||||
initTab()
|
||||
initBanner()
|
||||
initResource()
|
||||
initFlipper()
|
||||
homeViewModel.homeTagLiveData.observe(this) {
|
||||
loadTabList(transformTabList(it))
|
||||
}
|
||||
homeViewModel.getHomeTagInfo()
|
||||
FragmentVisibleStateHelper(this).start {
|
||||
onVisibleChanged(it)
|
||||
}
|
||||
}
|
||||
|
||||
private fun initListener() {
|
||||
@@ -83,20 +88,18 @@ class HomeRecommendFragment : BaseViewBindingFragment<FragmentHomeRecommendBindi
|
||||
}
|
||||
return@observe
|
||||
}
|
||||
resourceViews.forEach {
|
||||
it.isVisible = true
|
||||
}
|
||||
for (i in resourceViews.indices) {
|
||||
resourceViews[i].load(it[i].icon)
|
||||
resourceViews[i].setOnClickListener { _ ->
|
||||
resourceViews.forEachIndexed { index, imageView ->
|
||||
imageView.isVisible = true
|
||||
imageView.load(it[index].icon)
|
||||
imageView.setOnClickListener { _ ->
|
||||
when {
|
||||
it[i].resourceType == 5 -> {
|
||||
CommonWebViewActivity.start(context, it[i].resourceContent)
|
||||
it[index].resourceType == 5 -> {
|
||||
CommonWebViewActivity.start(context, it[index].resourceContent)
|
||||
}
|
||||
|
||||
else -> {
|
||||
dialogManager.showProgressDialog(mContext)
|
||||
homeViewModel.getResourceJumpInfo(it[i].id)
|
||||
homeViewModel.getResourceJumpInfo(it[index].id)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -140,6 +143,19 @@ class HomeRecommendFragment : BaseViewBindingFragment<FragmentHomeRecommendBindi
|
||||
homeViewModel.getBannerInfo()
|
||||
}
|
||||
|
||||
private fun initFlipper() {
|
||||
val rankAdapter = HomeRankViewFlipperAdapter()
|
||||
binding.viewFlipper.adapter = rankAdapter
|
||||
val list = ArrayList<List<String>>()
|
||||
repeat(3) {
|
||||
list.add(ArrayList())
|
||||
}
|
||||
rankAdapter.setNewData(list)
|
||||
binding.viewFlipper.setInAnimation(context, R.animator.home_rank_anim_in)
|
||||
binding.viewFlipper.setOutAnimation(context, R.animator.home_rank_anim_out)
|
||||
binding.viewFlipper.startFlipping()
|
||||
}
|
||||
|
||||
override fun onClick(v: View) {
|
||||
when (v.id) {
|
||||
R.id.tv_search -> {
|
||||
@@ -239,4 +255,11 @@ class HomeRecommendFragment : BaseViewBindingFragment<FragmentHomeRecommendBindi
|
||||
tabList.clear()
|
||||
}
|
||||
|
||||
private fun onVisibleChanged(isVisible: Boolean) {
|
||||
if (isVisible) {
|
||||
binding.viewFlipper.startFlipping()
|
||||
} else {
|
||||
binding.viewFlipper.stopFlipping()
|
||||
}
|
||||
}
|
||||
}
|
16
app/src/main/res/animator/home_rank_anim_in.xml
Normal file
16
app/src/main/res/animator/home_rank_anim_in.xml
Normal file
@@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:duration="800"
|
||||
android:interpolator="@android:anim/decelerate_interpolator">
|
||||
<propertyValuesHolder
|
||||
android:propertyName="translationY"
|
||||
android:valueFrom="80dp"
|
||||
android:valueTo="0"
|
||||
android:valueType="floatType" />
|
||||
<propertyValuesHolder
|
||||
android:duration="300"
|
||||
android:propertyName="alpha"
|
||||
android:valueFrom="0.4"
|
||||
android:valueTo="1.0"
|
||||
android:valueType="floatType" />
|
||||
</objectAnimator>
|
15
app/src/main/res/animator/home_rank_anim_out.xml
Normal file
15
app/src/main/res/animator/home_rank_anim_out.xml
Normal file
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:duration="400"
|
||||
android:interpolator="@android:anim/accelerate_interpolator">
|
||||
<propertyValuesHolder
|
||||
android:propertyName="translationY"
|
||||
android:valueFrom="0"
|
||||
android:valueTo="-20dp"
|
||||
android:valueType="floatType" />
|
||||
<propertyValuesHolder
|
||||
android:propertyName="alpha"
|
||||
android:valueFrom="1.0"
|
||||
android:valueTo="0.0"
|
||||
android:valueType="floatType" />
|
||||
</objectAnimator>
|
BIN
app/src/main/res/drawable-xxhdpi/home_rank_1.png
Normal file
BIN
app/src/main/res/drawable-xxhdpi/home_rank_1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 32 KiB |
BIN
app/src/main/res/drawable-xxhdpi/home_rank_2.png
Normal file
BIN
app/src/main/res/drawable-xxhdpi/home_rank_2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 17 KiB |
BIN
app/src/main/res/drawable-xxhdpi/home_rank_3.png
Normal file
BIN
app/src/main/res/drawable-xxhdpi/home_rank_3.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 18 KiB |
@@ -35,7 +35,7 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<com.makeramen.roundedimageview.RoundedImageView
|
||||
<com.google.android.material.imageview.ShapeableImageView
|
||||
android:id="@+id/iv_resource0"
|
||||
android:layout_width="@dimen/dp_0"
|
||||
android:layout_height="0dp"
|
||||
@@ -47,11 +47,21 @@
|
||||
app:layout_constraintHorizontal_weight="1"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:riv_corner_radius="@dimen/dp_4"
|
||||
app:shapeAppearance="@style/shape_corner_4dp"
|
||||
tools:src="@drawable/default_banner"
|
||||
tools:visibility="visible" />
|
||||
|
||||
<com.makeramen.roundedimageview.RoundedImageView
|
||||
<AdapterViewFlipper
|
||||
android:id="@+id/view_flipper"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:flipInterval="5000"
|
||||
app:layout_constraintBottom_toBottomOf="@id/iv_resource0"
|
||||
app:layout_constraintEnd_toEndOf="@id/iv_resource0"
|
||||
app:layout_constraintStart_toStartOf="@id/iv_resource0"
|
||||
app:layout_constraintTop_toTopOf="@id/iv_resource0" />
|
||||
|
||||
<com.google.android.material.imageview.ShapeableImageView
|
||||
android:id="@+id/iv_resource1"
|
||||
android:layout_width="@dimen/dp_0"
|
||||
android:layout_height="@dimen/dp_0"
|
||||
@@ -64,7 +74,7 @@
|
||||
app:layout_constraintHorizontal_weight="1"
|
||||
app:layout_constraintStart_toEndOf="@+id/iv_resource0"
|
||||
app:layout_constraintTop_toTopOf="@id/iv_resource0"
|
||||
app:riv_corner_radius="@dimen/dp_4"
|
||||
app:shapeAppearance="@style/shape_corner_4dp"
|
||||
tools:src="@drawable/default_banner"
|
||||
tools:visibility="visible" />
|
||||
|
||||
|
93
app/src/main/res/layout/home_recommend_item_rank.xml
Normal file
93
app/src/main/res/layout/home_recommend_item_rank.xml
Normal file
@@ -0,0 +1,93 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:background="#000000"
|
||||
tools:layout_height="82dp"
|
||||
tools:layout_width="170dp">
|
||||
|
||||
<com.google.android.material.imageview.ShapeableImageView
|
||||
android:id="@+id/iv_rank_1"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:src="@drawable/default_avatar"
|
||||
app:layout_constraintBottom_toBottomOf="@id/iv_rank_border_1"
|
||||
app:layout_constraintDimensionRatio="1:1"
|
||||
app:layout_constraintEnd_toEndOf="@id/iv_rank_border_1"
|
||||
app:layout_constraintStart_toStartOf="@id/iv_rank_border_1"
|
||||
app:layout_constraintTop_toTopOf="@id/iv_rank_border_1"
|
||||
app:layout_constraintVertical_bias="0.896"
|
||||
app:layout_constraintWidth_percent="0.2"
|
||||
app:shapeAppearance="@style/shape_circle" />
|
||||
|
||||
<com.google.android.material.imageview.ShapeableImageView
|
||||
android:id="@+id/iv_rank_2"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:src="@drawable/default_avatar"
|
||||
app:layout_constraintBottom_toBottomOf="@id/iv_rank_border_2"
|
||||
app:layout_constraintDimensionRatio="1:1"
|
||||
app:layout_constraintEnd_toEndOf="@id/iv_rank_border_2"
|
||||
app:layout_constraintStart_toStartOf="@id/iv_rank_border_2"
|
||||
app:layout_constraintTop_toTopOf="@id/iv_rank_border_2"
|
||||
app:layout_constraintVertical_bias="0.772"
|
||||
app:layout_constraintWidth_percent="0.126"
|
||||
app:shapeAppearance="@style/shape_circle" />
|
||||
|
||||
<com.google.android.material.imageview.ShapeableImageView
|
||||
android:id="@+id/iv_rank_3"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:src="@drawable/default_avatar"
|
||||
app:layout_constraintBottom_toBottomOf="@id/iv_rank_border_3"
|
||||
app:layout_constraintDimensionRatio="1:1"
|
||||
app:layout_constraintEnd_toEndOf="@id/iv_rank_border_3"
|
||||
app:layout_constraintStart_toStartOf="@id/iv_rank_border_3"
|
||||
app:layout_constraintTop_toTopOf="@id/iv_rank_border_3"
|
||||
app:layout_constraintVertical_bias="0.772"
|
||||
app:layout_constraintWidth_percent="0.126"
|
||||
app:shapeAppearance="@style/shape_circle" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/iv_rank_border_1"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:src="@drawable/home_rank_1"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintDimensionRatio="62:48.5"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintVertical_bias="0.268"
|
||||
app:layout_constraintWidth_percent="0.364" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/iv_rank_border_2"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:src="@drawable/home_rank_2"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintDimensionRatio="42.5:33"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintHorizontal_bias="0.164"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintVertical_bias="0.683"
|
||||
app:layout_constraintWidth_percent="0.25" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/iv_rank_border_3"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:src="@drawable/home_rank_3"
|
||||
app:layout_constraintBottom_toBottomOf="@id/iv_rank_border_2"
|
||||
app:layout_constraintDimensionRatio="42.5:33"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintHorizontal_bias="0.835"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="@id/iv_rank_border_2"
|
||||
app:layout_constraintWidth_percent="0.25" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
@@ -605,6 +605,11 @@
|
||||
<item name="cornerSize">50%</item>
|
||||
</style>
|
||||
|
||||
<style name="shape_corner_4dp">
|
||||
<item name="cornerFamily">rounded</item>
|
||||
<item name="cornerSize">@dimen/dp_4</item>
|
||||
</style>
|
||||
|
||||
<style name="shape_corner_5dp">
|
||||
<item name="cornerFamily">rounded</item>
|
||||
<item name="cornerSize">@dimen/dp_5</item>
|
||||
|
@@ -114,12 +114,6 @@ object HomeModel : BaseModel() {
|
||||
api.getGameRoom(pageNum, pageSize)
|
||||
}
|
||||
|
||||
|
||||
suspend fun getHomeTag(): List<HomeTagInfo>? =
|
||||
launchRequest {
|
||||
api.getHomeTag()
|
||||
}
|
||||
|
||||
suspend fun getConcernsRoom(): List<HomeRoomInfo>? =
|
||||
launchRequest {
|
||||
api.getConcernsRoom()
|
||||
@@ -350,14 +344,6 @@ object HomeModel : BaseModel() {
|
||||
@Query("pageSize") pageSize: Int
|
||||
): ServiceResult<List<HomeRoomInfo>>
|
||||
|
||||
/**
|
||||
* 首页派对 Tag List
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@GET("/home/tagV2")
|
||||
suspend fun getHomeTag(): ServiceResult<List<HomeTagInfo>>
|
||||
|
||||
/**
|
||||
* 首页派对 Tag List
|
||||
*
|
||||
|
Reference in New Issue
Block a user