From e1c0d528cae74d7128e8ac2cb94a520ce62fc226 Mon Sep 17 00:00:00 2001 From: YuBeen-Park Date: Mon, 26 Dec 2022 20:59:03 +0900 Subject: [PATCH] =?UTF-8?q?[mod]=20#5=20HomeFragment=20ListAdapter?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/home/GalleryFragment.kt | 4 +- .../sample/presentation/home/HomeFragment.kt | 7 ++- .../home/adapter/GalleryAdapter.kt} | 10 ++--- .../home/adapter/RepoAdapter.kt} | 45 ++++++++++++++----- 4 files changed, 43 insertions(+), 23 deletions(-) rename app/src/main/java/org/sopt/sample/{adapter/RepoAdapter.kt => presentation/home/adapter/GalleryAdapter.kt} (88%) rename app/src/main/java/org/sopt/sample/{adapter/GalleryAdapter.kt => presentation/home/adapter/RepoAdapter.kt} (51%) diff --git a/app/src/main/java/org/sopt/sample/presentation/home/GalleryFragment.kt b/app/src/main/java/org/sopt/sample/presentation/home/GalleryFragment.kt index 45140c1..f7f86dd 100644 --- a/app/src/main/java/org/sopt/sample/presentation/home/GalleryFragment.kt +++ b/app/src/main/java/org/sopt/sample/presentation/home/GalleryFragment.kt @@ -3,10 +3,10 @@ package org.sopt.sample.presentation.home import android.os.Bundle import android.view.View import org.sopt.sample.R -import org.sopt.sample.adapter.RepoAdapter import org.sopt.sample.base.BindingFragment import org.sopt.sample.data.Repo import org.sopt.sample.databinding.FragmentGalleryBinding +import org.sopt.sample.presentation.home.adapter.GalleryAdapter class GalleryFragment : BindingFragment(R.layout.fragment_gallery) { @@ -68,7 +68,7 @@ class GalleryFragment : BindingFragment(R.layout.fragmen } private fun initLayout() { - val adapter = RepoAdapter(requireContext()) + val adapter = GalleryAdapter(requireContext()) binding.rvRepos.adapter = adapter adapter.setRepoList(mockRepoList) } diff --git a/app/src/main/java/org/sopt/sample/presentation/home/HomeFragment.kt b/app/src/main/java/org/sopt/sample/presentation/home/HomeFragment.kt index ce578a8..2f3ff93 100644 --- a/app/src/main/java/org/sopt/sample/presentation/home/HomeFragment.kt +++ b/app/src/main/java/org/sopt/sample/presentation/home/HomeFragment.kt @@ -4,9 +4,8 @@ import android.os.Bundle import android.view.View import androidx.fragment.app.viewModels import androidx.recyclerview.widget.GridLayoutManager -import dagger.hilt.android.AndroidEntryPoint import org.sopt.sample.R -import org.sopt.sample.adapter.GalleryAdapter +import org.sopt.sample.adapter.RepoAdapter import org.sopt.sample.base.BindingFragment import org.sopt.sample.databinding.FragmentHomeBinding import org.sopt.sample.util.showSnackbar @@ -17,7 +16,7 @@ class HomeFragment : BindingFragment(R.layout.fragment_home private val viewModel by viewModels() - private lateinit var galleryAdapter: GalleryAdapter + private lateinit var galleryAdapter: RepoAdapter private lateinit var dialog: LoadingDialog override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -28,7 +27,7 @@ class HomeFragment : BindingFragment(R.layout.fragment_home private fun initLayout() { val gridManager = GridLayoutManager(requireContext(), SPAN_COUNT) - galleryAdapter = GalleryAdapter() + galleryAdapter = RepoAdapter() binding.rvGallery.apply { layoutManager = gridManager adapter = galleryAdapter diff --git a/app/src/main/java/org/sopt/sample/adapter/RepoAdapter.kt b/app/src/main/java/org/sopt/sample/presentation/home/adapter/GalleryAdapter.kt similarity index 88% rename from app/src/main/java/org/sopt/sample/adapter/RepoAdapter.kt rename to app/src/main/java/org/sopt/sample/presentation/home/adapter/GalleryAdapter.kt index 5dfd2a8..bbe155f 100644 --- a/app/src/main/java/org/sopt/sample/adapter/RepoAdapter.kt +++ b/app/src/main/java/org/sopt/sample/presentation/home/adapter/GalleryAdapter.kt @@ -1,4 +1,4 @@ -package org.sopt.sample.adapter +package org.sopt.sample.presentation.home.adapter import android.content.Context import android.view.LayoutInflater @@ -8,11 +8,11 @@ import org.sopt.sample.data.Repo import org.sopt.sample.databinding.LayoutGithubRepoBinding import org.sopt.sample.databinding.LayoutRecyclerTextBinding -class RepoAdapter(context: Context) : RecyclerView.Adapter() { +class GalleryAdapter(context: Context) : RecyclerView.Adapter() { private val inflater by lazy { LayoutInflater.from(context) } private var repoList: List = emptyList() - class RepoViewHolder( + class GalleryViewHolder( private val binding: LayoutGithubRepoBinding, ) : RecyclerView.ViewHolder(binding.root) { fun onRepoBind(data: Repo) { @@ -40,7 +40,7 @@ class RepoAdapter(context: Context) : RecyclerView.Adapter { val binding = LayoutGithubRepoBinding.inflate(inflater, parent, false) - RepoViewHolder(binding) + GalleryViewHolder(binding) } else -> { throw ClassCastException("Unknown viewType Error") @@ -55,7 +55,7 @@ class RepoAdapter(context: Context) : RecyclerView.Adapter { - (holder as RepoViewHolder).onRepoBind(repoList[position]) + (holder as GalleryViewHolder).onRepoBind(repoList[position]) } Repo.TEXT_TYPE -> { (holder as TextViewHolder).onTextBind(repoList[position]) diff --git a/app/src/main/java/org/sopt/sample/adapter/GalleryAdapter.kt b/app/src/main/java/org/sopt/sample/presentation/home/adapter/RepoAdapter.kt similarity index 51% rename from app/src/main/java/org/sopt/sample/adapter/GalleryAdapter.kt rename to app/src/main/java/org/sopt/sample/presentation/home/adapter/RepoAdapter.kt index e6c3dc9..fa5f765 100644 --- a/app/src/main/java/org/sopt/sample/adapter/GalleryAdapter.kt +++ b/app/src/main/java/org/sopt/sample/presentation/home/adapter/RepoAdapter.kt @@ -2,22 +2,28 @@ package org.sopt.sample.adapter import android.view.LayoutInflater import android.view.ViewGroup +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import coil.load import coil.transform.CircleCropTransformation import org.sopt.sample.R import org.sopt.sample.data.remote.response.ResponseUser import org.sopt.sample.databinding.LayoutGalleryRowBinding +import org.sopt.sample.presentation.home.adapter.GalleryAdapter -class GalleryAdapter : RecyclerView.Adapter() { - private var userItems: List? = emptyList() + +class RepoAdapter : ListAdapter( + FollowerDiffCallback +) { + private var userItems: List = emptyList() fun setItems(items: List) { this.userItems = items - notifyDataSetChanged() + submitList(items) } - class GalleryViewHolder( + class RepoViewHolder( private val binding: LayoutGalleryRowBinding ) : RecyclerView.ViewHolder(binding.root) { fun bind(user: ResponseUser.UserListInfo) { @@ -30,17 +36,32 @@ class GalleryAdapter : RecyclerView.Adapter() } } - override fun getItemCount() = userItems?.size ?: 0 + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RepoAdapter.RepoViewHolder { + val binding = + LayoutGalleryRowBinding.inflate(LayoutInflater.from(parent.context), parent, false) + return RepoAdapter.RepoViewHolder(binding) + } - override fun onBindViewHolder(holder: GalleryViewHolder, position: Int) { - userItems?.let { + override fun onBindViewHolder(holder: RepoAdapter.RepoViewHolder, position: Int) { + userItems.let { holder.bind(it[position]) } } - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): GalleryViewHolder { - val binding = - LayoutGalleryRowBinding.inflate(LayoutInflater.from(parent.context), parent, false) - return GalleryViewHolder(binding) +} + +object FollowerDiffCallback : DiffUtil.ItemCallback() { + override fun areItemsTheSame( + oldItem: ResponseUser.UserListInfo, + newItem: ResponseUser.UserListInfo + ): Boolean { + return oldItem.id == newItem.id + } + + override fun areContentsTheSame( + oldItem: ResponseUser.UserListInfo, + newItem: ResponseUser.UserListInfo + ): Boolean { + return oldItem == newItem } -} \ No newline at end of file +}