Skip to content

Commit f7c208d

Browse files
refactor(teams): Convert TeamCoursesAdapter to ListAdapter
Converted `TeamCoursesAdapter` from `RecyclerView.Adapter` to `ListAdapter` to leverage `DiffUtil` for more efficient list updates. - Modified the adapter to extend `ListAdapter`. - Implemented a `DIFF_CALLBACK` using `DiffUtils.itemCallback` to compare items. - Updated `TeamCoursesFragment` to instantiate the adapter without the initial list and to supply data via `adapter.submitList()`. - Used `realm.copyFromRealm()` to provide a stable, immutable list to the adapter, preventing threading issues with Realm's live objects during background diffing.
1 parent fb9fc10 commit f7c208d

File tree

2 files changed

+17
-13
lines changed

2 files changed

+17
-13
lines changed

app/src/main/java/org/ole/planet/myplanet/ui/teams/courses/TeamCoursesAdapter.kt

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,23 @@ import android.os.Bundle
66
import android.view.LayoutInflater
77
import android.view.View
88
import android.view.ViewGroup
9+
import androidx.recyclerview.widget.DiffUtil
10+
import androidx.recyclerview.widget.ListAdapter
911
import androidx.recyclerview.widget.RecyclerView
1012
import io.realm.Realm
1113
import org.ole.planet.myplanet.callback.OnHomeItemClickListener
1214
import org.ole.planet.myplanet.databinding.RowTeamResourceBinding
1315
import org.ole.planet.myplanet.model.RealmMyCourse
1416
import org.ole.planet.myplanet.model.RealmMyTeam.Companion.getTeamCreator
1517
import org.ole.planet.myplanet.ui.courses.TakeCourseFragment
18+
import org.ole.planet.myplanet.utilities.DiffUtils
1619

1720
class TeamCoursesAdapter(
1821
private val context: Context,
19-
private var list: MutableList<RealmMyCourse>,
2022
mRealm: Realm?,
2123
teamId: String?,
2224
settings: SharedPreferences
23-
) : RecyclerView.Adapter<TeamCoursesAdapter.ViewHolder>() {
25+
) : ListAdapter<RealmMyCourse, TeamCoursesAdapter.ViewHolder>(DIFF_CALLBACK) {
2426
private var listener: OnHomeItemClickListener? = null
2527
private val settings: SharedPreferences
2628
private val teamCreator: String
@@ -33,15 +35,13 @@ class TeamCoursesAdapter(
3335
teamCreator = getTeamCreator(teamId, mRealm)
3436
}
3537

36-
fun getList(): List<RealmMyCourse> = list
37-
3838
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
3939
val binding = RowTeamResourceBinding.inflate(LayoutInflater.from(context), parent, false)
4040
return ViewHolder(binding)
4141
}
4242

4343
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
44-
val course = list[position]
44+
val course = getItem(position)
4545
holder.binding.tvTitle.text = course.courseTitle
4646
holder.binding.tvDescription.text = course.description
4747
holder.binding.root.setOnClickListener {
@@ -56,9 +56,13 @@ class TeamCoursesAdapter(
5656
}
5757
}
5858

59-
override fun getItemCount(): Int {
60-
return list.size
61-
}
62-
6359
class ViewHolder(val binding: RowTeamResourceBinding) : RecyclerView.ViewHolder(binding.root)
60+
61+
companion object {
62+
val DIFF_CALLBACK: DiffUtil.ItemCallback<RealmMyCourse> =
63+
DiffUtils.itemCallback(
64+
areItemsTheSame = { old, new -> old.courseId == new.courseId },
65+
areContentsTheSame = { old, new -> old == new }
66+
)
67+
}
6468
}

app/src/main/java/org/ole/planet/myplanet/ui/teams/courses/TeamCoursesFragment.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,12 @@ class TeamCoursesFragment : BaseTeamFragment() {
2727

2828
private fun setupCoursesList() {
2929
val courses = mRealm.where(RealmMyCourse::class.java).`in`("id", team?.courses?.toTypedArray<String>()).findAll()
30-
adapterTeamCourse = settings?.let { TeamCoursesAdapter(requireActivity(), courses.toMutableList(), mRealm, teamId, it) }
30+
val courseList = mRealm.copyFromRealm(courses)
31+
adapterTeamCourse = settings?.let { TeamCoursesAdapter(requireActivity(), mRealm, teamId, it) }
3132
binding.rvCourse.layoutManager = LinearLayoutManager(activity)
3233
binding.rvCourse.adapter = adapterTeamCourse
33-
adapterTeamCourse?.let {
34-
showNoData(binding.tvNodata, it.itemCount, "teamCourses")
35-
}
34+
adapterTeamCourse?.submitList(courseList)
35+
showNoData(binding.tvNodata, courseList.size, "teamCourses")
3636
}
3737
override fun onNewsItemClick(news: RealmNews?) {}
3838
override fun clearImages() {

0 commit comments

Comments
 (0)