refactor: 캐릭터 탭 내부에서 사용하는 Adapter 코드를 ViewBinding 코드로 리팩토링
This commit is contained in:
@@ -4,6 +4,5 @@ data class Character(
|
|||||||
val id: String,
|
val id: String,
|
||||||
val name: String,
|
val name: String,
|
||||||
val description: String,
|
val description: String,
|
||||||
val imageUrl: String,
|
val imageUrl: String
|
||||||
val ranking: Int? = null // 인기 캐릭터에서만 사용
|
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,14 +1,13 @@
|
|||||||
package kr.co.vividnext.sodalive.chat.character
|
package kr.co.vividnext.sodalive.chat.character
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
|
import android.content.Context
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.widget.ImageView
|
|
||||||
import android.widget.LinearLayout
|
|
||||||
import android.widget.TextView
|
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import kr.co.vividnext.sodalive.R
|
import com.bumptech.glide.Glide
|
||||||
import kr.co.vividnext.sodalive.chat.character.Character
|
import kr.co.vividnext.sodalive.databinding.ItemCharacterBinding
|
||||||
|
|
||||||
class CharacterAdapter(
|
class CharacterAdapter(
|
||||||
private var characters: List<Character> = emptyList(),
|
private var characters: List<Character> = emptyList(),
|
||||||
@@ -16,46 +15,47 @@ class CharacterAdapter(
|
|||||||
private val onCharacterClick: (Character) -> Unit = {}
|
private val onCharacterClick: (Character) -> Unit = {}
|
||||||
) : RecyclerView.Adapter<CharacterAdapter.ViewHolder>() {
|
) : RecyclerView.Adapter<CharacterAdapter.ViewHolder>() {
|
||||||
|
|
||||||
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
|
inner class ViewHolder(
|
||||||
val ivCharacter: ImageView = itemView.findViewById(R.id.iv_character)
|
private val context: Context,
|
||||||
val tvCharacterName: TextView = itemView.findViewById(R.id.tv_character_name)
|
private val binding: ItemCharacterBinding
|
||||||
val tvCharacterDescription: TextView = itemView.findViewById(R.id.tv_character_description)
|
) : RecyclerView.ViewHolder(binding.root) {
|
||||||
val llRanking: LinearLayout = itemView.findViewById(R.id.ll_ranking)
|
@SuppressLint("SetTextI18n")
|
||||||
val tvRanking: TextView = itemView.findViewById(R.id.tv_ranking)
|
fun bind(character: Character, index: Int) {
|
||||||
}
|
binding.tvCharacterName.text = character.name
|
||||||
|
binding.tvCharacterDescription.text = character.description
|
||||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
|
||||||
val view = LayoutInflater.from(parent.context)
|
|
||||||
.inflate(R.layout.item_character, parent, false)
|
|
||||||
return ViewHolder(view)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
|
|
||||||
val character = characters[position]
|
|
||||||
|
|
||||||
holder.tvCharacterName.text = character.name
|
|
||||||
holder.tvCharacterDescription.text = character.description
|
|
||||||
|
|
||||||
// 순위 표시 여부 결정
|
// 순위 표시 여부 결정
|
||||||
if (showRanking && character.ranking != null) {
|
if (showRanking) {
|
||||||
holder.llRanking.visibility = View.VISIBLE
|
binding.llRanking.visibility = View.VISIBLE
|
||||||
holder.tvRanking.text = character.ranking.toString()
|
binding.tvRanking.text = (index + 1).toString()
|
||||||
} else {
|
} else {
|
||||||
holder.llRanking.visibility = View.GONE
|
binding.llRanking.visibility = View.GONE
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: 이미지 로딩 라이브러리 사용 (Glide, Picasso 등)
|
Glide.with(context)
|
||||||
// Glide.with(holder.itemView.context)
|
.load(character.imageUrl)
|
||||||
// .load(character.imageUrl)
|
.into(binding.ivCharacter)
|
||||||
// .into(holder.ivCharacter)
|
|
||||||
|
|
||||||
holder.itemView.setOnClickListener {
|
binding.root.setOnClickListener { onCharacterClick(character) }
|
||||||
onCharacterClick(character)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ViewHolder(
|
||||||
|
parent.context,
|
||||||
|
ItemCharacterBinding.inflate(
|
||||||
|
LayoutInflater.from(parent.context),
|
||||||
|
parent,
|
||||||
|
false
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
|
||||||
|
holder.bind(characters[position], index = position)
|
||||||
|
}
|
||||||
|
|
||||||
override fun getItemCount(): Int = characters.size
|
override fun getItemCount(): Int = characters.size
|
||||||
|
|
||||||
|
@SuppressLint("NotifyDataSetChanged")
|
||||||
fun updateCharacters(newCharacters: List<Character>) {
|
fun updateCharacters(newCharacters: List<Character>) {
|
||||||
characters = newCharacters
|
characters = newCharacters
|
||||||
notifyDataSetChanged()
|
notifyDataSetChanged()
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ class CharacterTabFragment : BaseFragment<FragmentCharacterTabBinding>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 전체보기 버튼 클릭 리스너
|
// 전체보기 버튼 클릭 리스너
|
||||||
binding.tvFamousCharacterAll.setOnClickListener {
|
binding.tvPopularCharacterAll.setOnClickListener {
|
||||||
// 인기 캐릭터 전체보기 처리
|
// 인기 캐릭터 전체보기 처리
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -106,11 +106,11 @@ class CharacterTabFragment : BaseFragment<FragmentCharacterTabBinding>(
|
|||||||
private fun loadPopularCharacters() {
|
private fun loadPopularCharacters() {
|
||||||
// TODO: 서버에서 인기 캐릭터 데이터 로드
|
// TODO: 서버에서 인기 캐릭터 데이터 로드
|
||||||
val popularCharacters = listOf(
|
val popularCharacters = listOf(
|
||||||
Character("1", "캐릭터 이름", "캐릭터 한줄 소개인데 2줄까", "", 1),
|
Character("1", "캐릭터 이름", "캐릭터 한줄 소개인데 2줄까", ""),
|
||||||
Character("2", "캐릭터 이름", "캐릭터 한줄 소개인데 2줄까", "", 2),
|
Character("2", "캐릭터 이름", "캐릭터 한줄 소개인데 2줄까", ""),
|
||||||
Character("3", "캐릭터 이름", "#태그#태그#태그", "", 3),
|
Character("3", "캐릭터 이름", "#태그#태그#태그", ""),
|
||||||
Character("4", "캐릭터 이름", "캐릭터 한줄 소개인데 2줄까", "", 4),
|
Character("4", "캐릭터 이름", "캐릭터 한줄 소개인데 2줄까", ""),
|
||||||
Character("5", "캐릭터 이름", "캐릭터 한줄 소개인데 2줄까", "", 5)
|
Character("5", "캐릭터 이름", "캐릭터 한줄 소개인데 2줄까", "")
|
||||||
)
|
)
|
||||||
|
|
||||||
popularCharacterAdapter.updateCharacters(popularCharacters)
|
popularCharacterAdapter.updateCharacters(popularCharacters)
|
||||||
|
|||||||
@@ -1,36 +1,24 @@
|
|||||||
package kr.co.vividnext.sodalive.chat.character.curation
|
package kr.co.vividnext.sodalive.chat.character.curation
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.widget.TextView
|
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import kr.co.vividnext.sodalive.R
|
|
||||||
import kr.co.vividnext.sodalive.chat.character.CharacterAdapter
|
|
||||||
import kr.co.vividnext.sodalive.chat.character.Character
|
import kr.co.vividnext.sodalive.chat.character.Character
|
||||||
import kr.co.vividnext.sodalive.chat.character.curation.CurationSection
|
import kr.co.vividnext.sodalive.chat.character.CharacterAdapter
|
||||||
|
import kr.co.vividnext.sodalive.databinding.ItemCurationSectionBinding
|
||||||
|
|
||||||
class CurationSectionAdapter(
|
class CurationSectionAdapter(
|
||||||
private var sections: List<CurationSection> = emptyList(),
|
private var sections: List<CurationSection> = emptyList(),
|
||||||
private val onCharacterClick: (Character) -> Unit = {}
|
private val onCharacterClick: (Character) -> Unit = {}
|
||||||
) : RecyclerView.Adapter<CurationSectionAdapter.ViewHolder>() {
|
) : RecyclerView.Adapter<CurationSectionAdapter.ViewHolder>() {
|
||||||
|
|
||||||
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
|
inner class ViewHolder(
|
||||||
val tvSectionTitle: TextView = itemView.findViewById(R.id.tv_section_title)
|
private val binding: ItemCurationSectionBinding
|
||||||
val rvCharacters: RecyclerView = itemView.findViewById(R.id.rv_characters)
|
) : RecyclerView.ViewHolder(binding.root) {
|
||||||
}
|
fun bind(section: CurationSection) {
|
||||||
|
binding.tvSectionTitle.text = section.title
|
||||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
|
||||||
val view = LayoutInflater.from(parent.context)
|
|
||||||
.inflate(R.layout.item_curation_section, parent, false)
|
|
||||||
return ViewHolder(view)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
|
|
||||||
val section = sections[position]
|
|
||||||
|
|
||||||
holder.tvSectionTitle.text = section.title
|
|
||||||
|
|
||||||
// 캐릭터 리스트 설정
|
// 캐릭터 리스트 설정
|
||||||
val characterAdapter = CharacterAdapter(
|
val characterAdapter = CharacterAdapter(
|
||||||
@@ -39,14 +27,32 @@ class CurationSectionAdapter(
|
|||||||
onCharacterClick = onCharacterClick
|
onCharacterClick = onCharacterClick
|
||||||
)
|
)
|
||||||
|
|
||||||
holder.rvCharacters.apply {
|
binding.rvCharacters.apply {
|
||||||
layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
|
layoutManager = LinearLayoutManager(
|
||||||
|
context,
|
||||||
|
LinearLayoutManager.HORIZONTAL,
|
||||||
|
false
|
||||||
|
)
|
||||||
adapter = characterAdapter
|
adapter = characterAdapter
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ViewHolder(
|
||||||
|
ItemCurationSectionBinding.inflate(
|
||||||
|
LayoutInflater.from(parent.context),
|
||||||
|
parent,
|
||||||
|
false
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
|
||||||
|
holder.bind(sections[position])
|
||||||
|
}
|
||||||
|
|
||||||
override fun getItemCount(): Int = sections.size
|
override fun getItemCount(): Int = sections.size
|
||||||
|
|
||||||
|
@SuppressLint("NotifyDataSetChanged")
|
||||||
fun updateSections(newSections: List<CurationSection>) {
|
fun updateSections(newSections: List<CurationSection>) {
|
||||||
sections = newSections
|
sections = newSections
|
||||||
notifyDataSetChanged()
|
notifyDataSetChanged()
|
||||||
|
|||||||
@@ -1,43 +1,43 @@
|
|||||||
package kr.co.vividnext.sodalive.chat.character.recent
|
package kr.co.vividnext.sodalive.chat.character.recent
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
|
import android.content.Context
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.widget.ImageView
|
|
||||||
import android.widget.TextView
|
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import kr.co.vividnext.sodalive.R
|
import com.bumptech.glide.Glide
|
||||||
|
import kr.co.vividnext.sodalive.databinding.ItemRecentCharacterBinding
|
||||||
|
|
||||||
class RecentCharacterAdapter(
|
class RecentCharacterAdapter(
|
||||||
private var characters: List<RecentCharacter> = emptyList(),
|
private var characters: List<RecentCharacter> = emptyList(),
|
||||||
private val onCharacterClick: (RecentCharacter) -> Unit = {}
|
private val onCharacterClick: (RecentCharacter) -> Unit = {}
|
||||||
) : RecyclerView.Adapter<RecentCharacterAdapter.ViewHolder>() {
|
) : RecyclerView.Adapter<RecentCharacterAdapter.ViewHolder>() {
|
||||||
|
|
||||||
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
|
inner class ViewHolder(
|
||||||
val ivProfile: ImageView = itemView.findViewById(R.id.iv_profile)
|
private val context: Context,
|
||||||
val tvName: TextView = itemView.findViewById(R.id.tv_name)
|
private val binding: ItemRecentCharacterBinding
|
||||||
|
) : RecyclerView.ViewHolder(binding.root) {
|
||||||
|
fun bind(character: RecentCharacter) {
|
||||||
|
binding.tvName.text = character.name
|
||||||
|
Glide.with(context)
|
||||||
|
.load(character.profileImageUrl)
|
||||||
|
.into(binding.ivProfile)
|
||||||
|
|
||||||
|
binding.root.setOnClickListener { onCharacterClick(character) }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ViewHolder(
|
||||||
val view = LayoutInflater.from(parent.context)
|
parent.context,
|
||||||
.inflate(R.layout.item_recent_character, parent, false)
|
ItemRecentCharacterBinding.inflate(
|
||||||
return ViewHolder(view)
|
LayoutInflater.from(parent.context),
|
||||||
}
|
parent,
|
||||||
|
false
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
|
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
|
||||||
val character = characters[position]
|
holder.bind(characters[position])
|
||||||
|
|
||||||
holder.tvName.text = character.name
|
|
||||||
|
|
||||||
// TODO: 이미지 로딩 라이브러리 사용 (Glide, Picasso 등)
|
|
||||||
// Glide.with(holder.itemView.context)
|
|
||||||
// .load(character.profileImageUrl)
|
|
||||||
// .into(holder.ivProfile)
|
|
||||||
|
|
||||||
holder.itemView.setOnClickListener {
|
|
||||||
onCharacterClick(character)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getItemCount(): Int = characters.size
|
override fun getItemCount(): Int = characters.size
|
||||||
|
|||||||
@@ -105,7 +105,7 @@
|
|||||||
android:textSize="24sp" />
|
android:textSize="24sp" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/tv_famous_character_all"
|
android:id="@+id/tv_popular_character_all"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:fontFamily="@font/pretendard_regular"
|
android:fontFamily="@font/pretendard_regular"
|
||||||
@@ -121,8 +121,7 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginTop="16dp"
|
android:layout_marginTop="16dp"
|
||||||
android:clipToPadding="false"
|
android:clipToPadding="false"
|
||||||
android:paddingStart="24dp" />
|
android:paddingHorizontal="24dp" />
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
<!-- 신규 캐릭터 섹션 -->
|
<!-- 신규 캐릭터 섹션 -->
|
||||||
@@ -167,7 +166,7 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginTop="16dp"
|
android:layout_marginTop="16dp"
|
||||||
android:clipToPadding="false"
|
android:clipToPadding="false"
|
||||||
android:paddingStart="24dp" />
|
android:paddingHorizontal="24dp" />
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
@@ -177,7 +176,5 @@
|
|||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginBottom="24dp" />
|
android:layout_marginBottom="24dp" />
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
</androidx.core.widget.NestedScrollView>
|
</androidx.core.widget.NestedScrollView>
|
||||||
Reference in New Issue
Block a user