角色tag 初步

This commit is contained in:
renhaoting 2025-11-04 14:26:34 +08:00
parent 9aac716672
commit 2fe723aead
19 changed files with 57 additions and 62 deletions

View File

@ -3,22 +3,21 @@ package com.remax.visualnovel.api.service
import com.remax.visualnovel.BuildConfig import com.remax.visualnovel.BuildConfig
import com.remax.visualnovel.entity.response.basenew.ResponseNew import com.remax.visualnovel.entity.response.basenew.ResponseNew
import com.remax.visualnovel.entity.request.ParamActorList import com.remax.visualnovel.entity.request.ParamActorList
import com.remax.visualnovel.entity.request.ParamActorTag
import com.remax.visualnovel.entity.response.ActorBean import com.remax.visualnovel.entity.response.ActorBean
import com.remax.visualnovel.entity.response.ActorTag import com.remax.visualnovel.widget.custom.ActorTag
import retrofit2.http.Body import retrofit2.http.Body
import retrofit2.http.GET import retrofit2.http.GET
import retrofit2.http.POST import retrofit2.http.POST
interface ActorsService { interface ActorsService {
@GET(BuildConfig.API_BASE + "/tag/getTags") @POST(BuildConfig.API_BASE + "/tag/selectByCondition")
suspend fun requestActorTags(): ResponseNew<List<ActorTag>> suspend fun requestActorTags(@Body param: ParamActorTag): ResponseNew<List<ActorTag>>
@POST(BuildConfig.API_BASE + "/character/select/list") @POST(BuildConfig.API_BASE + "/character/select/list")
suspend fun requestActorList(@Body param: ParamActorList): ResponseNew<List<ActorBean>> suspend fun requestActorList(@Body param: ParamActorList): ResponseNew<List<ActorBean>>
/*@GET(BuildConfig.API_BASE + "/character/select/roleInfo/{roleId}")
suspend fun requestActorInfo(): ResponseNew<ActorTag>*/
} }

View File

@ -0,0 +1,7 @@
package com.remax.visualnovel.entity.request
data class ParamActorTag(
var name: String = "",
var limit: Int = 5
)

View File

@ -1,7 +0,0 @@
package com.remax.visualnovel.entity.response
data class ActorTag(
val tagName: String,
val tagId: Long
)

View File

@ -2,13 +2,14 @@ package com.remax.visualnovel.repository.api
import com.remax.visualnovel.api.service.ActorsService import com.remax.visualnovel.api.service.ActorsService
import com.remax.visualnovel.entity.request.ParamActorList import com.remax.visualnovel.entity.request.ParamActorList
import com.remax.visualnovel.entity.request.ParamActorTag
import com.remax.visualnovel.repository.api.base.BaseRepositoryNew import com.remax.visualnovel.repository.api.base.BaseRepositoryNew
import javax.inject.Inject import javax.inject.Inject
class ActorsRepository @Inject constructor(private val mActorsService: ActorsService) : BaseRepositoryNew() { class ActorsRepository @Inject constructor(private val mActorsService: ActorsService) : BaseRepositoryNew() {
suspend fun getActorTags() = executeHttp { suspend fun getActorTags(param: ParamActorTag) = executeHttp {
mActorsService.requestActorTags() mActorsService.requestActorTags(param)
} }
suspend fun getActorList(param: ParamActorList) = executeHttp { suspend fun getActorList(param: ParamActorList) = executeHttp {

View File

@ -8,6 +8,7 @@ import androidx.appcompat.widget.AppCompatImageView
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.viewpager2.adapter.FragmentStateAdapter import androidx.viewpager2.adapter.FragmentStateAdapter
import com.alibaba.android.arouter.facade.annotation.Route import com.alibaba.android.arouter.facade.annotation.Route
import com.gyf.immersionbar.ImmersionBar
import com.remax.visualnovel.R import com.remax.visualnovel.R
import com.remax.visualnovel.app.base.BaseBindingActivity import com.remax.visualnovel.app.base.BaseBindingActivity
import com.remax.visualnovel.databinding.ActivityMainBinding import com.remax.visualnovel.databinding.ActivityMainBinding
@ -30,7 +31,6 @@ import com.remax.visualnovel.ui.main.actor.ActorListFragment
import com.remax.visualnovel.ui.main.book.BookListFragment import com.remax.visualnovel.ui.main.book.BookListFragment
import com.remax.visualnovel.ui.main.history.HistoryFragment import com.remax.visualnovel.ui.main.history.HistoryFragment
import com.remax.visualnovel.ui.main.managa.MangaListFragment import com.remax.visualnovel.ui.main.managa.MangaListFragment
import com.remax.visualnovel.utils.StatusBarUtil3
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
@ -42,9 +42,12 @@ class MainActivity : BaseBindingActivity<ActivityMainBinding>() {
private val mainViewModel by viewModels<MainViewModel>() private val mainViewModel by viewModels<MainViewModel>()
override fun initView() { override fun initView() {
/*StatusBarUtils.setStatusBarAndNavBarIsLight(this, false) ImmersionBar.with(this)
StatusBarUtils.setTransparent(this)*/ .transparentStatusBar()
StatusBarUtil3.setImmersiveStatusBar(this, true) .statusBarColor(R.color.transparent)
.statusBarDarkFont(true)
.fitsSystemWindows(true)
.init();
onBackPressedDispatcher.addCallback(this) { onBackPressedDispatcher.addCallback(this) {
if (mainViewModel.canBack) { if (mainViewModel.canBack) {

View File

@ -9,19 +9,19 @@ import androidx.recyclerview.widget.DefaultItemAnimator
import androidx.recyclerview.widget.StaggeredGridLayoutManager import androidx.recyclerview.widget.StaggeredGridLayoutManager
import com.alibaba.android.arouter.facade.annotation.Route import com.alibaba.android.arouter.facade.annotation.Route
import com.alibaba.android.arouter.launcher.ARouter import com.alibaba.android.arouter.launcher.ARouter
import com.chad.library.adapter.base.loadmore.LoadMoreStatus
import com.dylanc.loadingstateview.BgColorType import com.dylanc.loadingstateview.BgColorType
import com.remax.visualnovel.R import com.remax.visualnovel.R
import com.remax.visualnovel.app.base.BaseBindingFragment import com.remax.visualnovel.app.base.BaseBindingFragment
import com.remax.visualnovel.app.widget.setMyEmptyView import com.remax.visualnovel.app.widget.setMyEmptyView
import com.remax.visualnovel.configs.NovelApplication import com.remax.visualnovel.configs.NovelApplication
import com.remax.visualnovel.databinding.FragmentMainActorBinding import com.remax.visualnovel.databinding.FragmentMainActorBinding
import com.remax.visualnovel.entity.request.PageQuery
import com.remax.visualnovel.entity.request.ParamActorList import com.remax.visualnovel.entity.request.ParamActorList
import com.remax.visualnovel.entity.request.ParamActorTag
import com.remax.visualnovel.entity.response.ActorBean import com.remax.visualnovel.entity.response.ActorBean
import com.remax.visualnovel.extension.launchAndCollect2 import com.remax.visualnovel.extension.launchAndCollect2
import com.remax.visualnovel.utils.Routers import com.remax.visualnovel.utils.Routers
import com.remax.visualnovel.utils.StatusBarUtil3 import com.remax.visualnovel.utils.StatusBarUtil3
import com.remax.visualnovel.widget.custom.ActorTag
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlin.getValue import kotlin.getValue
import kotlin.math.max import kotlin.math.max
@ -35,6 +35,7 @@ class ActorListFragment : BaseBindingFragment<FragmentMainActorBinding>() {
private val mActorsModel by viewModels<ActorsViewModel>() private val mActorsModel by viewModels<ActorsViewModel>()
private var mLoadedPageIndex = 0 private var mLoadedPageIndex = 0
private val mRequestParam by lazy { ParamActorList() } private val mRequestParam by lazy { ParamActorList() }
private val mRequestTagsParam by lazy { ParamActorTag() }
override fun onCreated(bundle: Bundle?) { override fun onCreated(bundle: Bundle?) {
@ -46,6 +47,7 @@ class ActorListFragment : BaseBindingFragment<FragmentMainActorBinding>() {
} }
override fun lazyInit() { override fun lazyInit() {
getActorTags()
getActorList(true, showLoading = false) getActorList(true, showLoading = false)
} }
@ -93,23 +95,18 @@ class ActorListFragment : BaseBindingFragment<FragmentMainActorBinding>() {
private fun initTagLayout() { private fun initTagLayout() {
with(binding) { with(binding) {
val tags = listOf( /*val tags = listOf(
ActorTagBean("1", "Youth"), ActorTag(1, "Youth"),
ActorTagBean("2", "Lolita"), ActorTag(2, "Lolita"),
ActorTagBean("2", "Lolita2"), ActorTag(3, "Lolita2"),
ActorTagBean("3", "Overbearing CEO ABCDEFG Overbearing CEO ABCDEFG Overbearing CEO ABCDEFG"), ActorTag(4, "Overbearing CEO ABCDEFG Overbearing CEO ABCDEFG Overbearing CEO ABCDEFG"),
ActorTagBean("3", "ggggggggggg CEO ABCDEFG Overbearing CEO ABCDEFG Overbearing CEO ABCDEFG"), ActorTag(5, "ggggggggggg CEO ABCDEFG Overbearing CEO ABCDEFG Overbearing CEO ABCDEFG"),
ActorTagBean("4", "Uncle"),
ActorTagBean("5", "Character Status"),
ActorTagBean("6", "Imouto"),
ActorTagBean("7", "Fanwork"),
ActorTagBean("8", "LastLine"),
) )
tagFlowLayout.setTagDataList(tags) tagFlowLayout.setTagDataList(tags)
*/
tagFlowLayout.setOnTagClickListener { tag -> tagFlowLayout.setOnTagClickListener { tag ->
Toast.makeText(context, "Clicked: ${tag.showStr}", Toast.LENGTH_SHORT).show() Toast.makeText(context, "Clicked: ${tag.name}", Toast.LENGTH_SHORT).show()
} }
tagFlowLayout.setOnExpandStateChangeListener { isExpanded -> tagFlowLayout.setOnExpandStateChangeListener { isExpanded ->
@ -152,22 +149,24 @@ class ActorListFragment : BaseBindingFragment<FragmentMainActorBinding>() {
binding.refreshLayout.finishRefresh() binding.refreshLayout.finishRefresh()
} }
} }
onFailed = { errorCode, errorMsg ->
var temp = 100
}
onFailedWithData = {
var temp = 100
}
} }
} }
private fun getActorTags() {
mRequestTagsParam.limit = Int.MAX_VALUE
launchAndCollect2({
mActorsModel.getActorTags(mRequestTagsParam)
}, showLoading = false) {
onSuccess = {
val data = it ?: emptyList()
binding.tagFlowLayout.setTagDataList(data)
}
}
}
private fun createSampleData(): List<ActorBean> { private fun createSampleData(): List<ActorBean> {

View File

@ -1,7 +0,0 @@
package com.remax.visualnovel.ui.main.actor
import com.remax.visualnovel.widget.custom.AbsTagBean
data class ActorTagBean(val tagId: String, override val showStr: String) : AbsTagBean(showStr) {
}

View File

@ -3,6 +3,7 @@ package com.remax.visualnovel.ui.main.actor
import com.remax.visualnovel.app.viewmodel.base.BaseViewModel import com.remax.visualnovel.app.viewmodel.base.BaseViewModel
import com.remax.visualnovel.entity.request.ParamActorList import com.remax.visualnovel.entity.request.ParamActorList
import com.remax.visualnovel.entity.request.ParamActorTag
import com.remax.visualnovel.entity.response.basenew.ResponseNew import com.remax.visualnovel.entity.response.basenew.ResponseNew
import com.remax.visualnovel.entity.response.ActorBean import com.remax.visualnovel.entity.response.ActorBean
import com.remax.visualnovel.repository.api.ActorsRepository import com.remax.visualnovel.repository.api.ActorsRepository
@ -21,4 +22,6 @@ class ActorsViewModel @Inject constructor(private val mActorsRepository: ActorsR
suspend fun getActorList(param: ParamActorList) = mActorsRepository.getActorList(param) suspend fun getActorList(param: ParamActorList) = mActorsRepository.getActorList(param)
suspend fun getActorTags(param: ParamActorTag) = mActorsRepository.getActorTags(param)
} }

View File

@ -1,6 +1,7 @@
package com.remax.visualnovel.widget.custom package com.remax.visualnovel.widget.custom
abstract class AbsTagBean( data class ActorTag(
open val showStr: String, val id: Int,
val name: String,
var isSelected: Boolean = false var isSelected: Boolean = false
) )

View File

@ -45,12 +45,12 @@ class TagFlowLayout2 @JvmOverloads constructor(
private var eachLineAvailableWidth = 0 private var eachLineAvailableWidth = 0
// 数据 // 数据
private val tagItems = mutableListOf<AbsTagBean>() private val tagItems = mutableListOf<ActorTag>()
private val tagViews = mutableListOf<TextView>() private val tagViews = mutableListOf<TextView>()
private lateinit var expandIcon: ImageView private lateinit var expandIcon: ImageView
// 监听器 // 监听器
private var onTagClickListener: ((AbsTagBean) -> Unit)? = null private var onTagClickListener: ((ActorTag) -> Unit)? = null
private var onExpandStateChangeListener: ((Boolean) -> Unit)? = null private var onExpandStateChangeListener: ((Boolean) -> Unit)? = null
init { init {
@ -115,7 +115,7 @@ class TagFlowLayout2 @JvmOverloads constructor(
} }
fun setTagDataList(tags: List<AbsTagBean>) { fun setTagDataList(tags: List<ActorTag>) {
tagItems.clear() tagItems.clear()
tagViews.forEach { removeView(it) } tagViews.forEach { removeView(it) }
tagViews.clear() tagViews.clear()
@ -130,9 +130,9 @@ class TagFlowLayout2 @JvmOverloads constructor(
requestLayout() requestLayout()
} }
private fun createTagView(tag: AbsTagBean): TextView { private fun createTagView(tag: ActorTag): TextView {
return TextView(context).apply { return TextView(context).apply {
text = tag.showStr text = tag.name
setTextColor(textColor) setTextColor(textColor)
textSize = textSize / resources.displayMetrics.scaledDensity textSize = textSize / resources.displayMetrics.scaledDensity
setPadding(10.dpToPx(), 7.dpToPx(), 10.dpToPx(), 7.dpToPx()) setPadding(10.dpToPx(), 7.dpToPx(), 10.dpToPx(), 7.dpToPx())
@ -298,7 +298,7 @@ class TagFlowLayout2 @JvmOverloads constructor(
expandIcon.setImageDrawable(indicator) expandIcon.setImageDrawable(indicator)
} }
fun setOnTagClickListener(listener: (AbsTagBean) -> Unit) { fun setOnTagClickListener(listener: (ActorTag) -> Unit) {
onTagClickListener = listener onTagClickListener = listener
} }
@ -326,7 +326,7 @@ class TagFlowLayout2 @JvmOverloads constructor(
requestLayout() requestLayout()
} }
fun getSelectedTagList() : List<AbsTagBean> { fun getSelectedTagList() : List<ActorTag> {
return tagItems.filter { it.isSelected } return tagItems.filter { it.isSelected }
} }

View File

@ -1,2 +0,0 @@
Manifest-Version: 1.0