Skip to content

Commit b2e90ee

Browse files
committed
Use DiffUtil to calculate difference for LogsAdapter
LogsFragment was lagging my Android Interop on my System. This is because `notifyDataSetChanged` is used, it is computationally intensive and should never be used. Implementation of a quick DiffUtil calculator solves this. In response to work done: streetcomplete#5482
1 parent 0ffddeb commit b2e90ee

File tree

1 file changed

+25
-2
lines changed
  • app/src/main/java/de/westnordost/streetcomplete/screens/about

1 file changed

+25
-2
lines changed

app/src/main/java/de/westnordost/streetcomplete/screens/about/LogsAdapter.kt

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package de.westnordost.streetcomplete.screens.about
33
import android.view.LayoutInflater
44
import android.view.ViewGroup
55
import androidx.core.widget.TextViewCompat
6+
import androidx.recyclerview.widget.DiffUtil
67
import androidx.recyclerview.widget.RecyclerView
78
import de.westnordost.streetcomplete.data.logs.LogMessage
89
import de.westnordost.streetcomplete.databinding.RowLogMessageBinding
@@ -12,7 +13,8 @@ import kotlinx.datetime.toLocalDateTime
1213

1314
class LogsAdapter : RecyclerView.Adapter<LogsAdapter.ViewHolder>() {
1415

15-
class ViewHolder(private val binding: RowLogMessageBinding) : RecyclerView.ViewHolder(binding.root) {
16+
class ViewHolder(private val binding: RowLogMessageBinding) :
17+
RecyclerView.ViewHolder(binding.root) {
1618
fun onBind(with: LogMessage) {
1719
binding.messageTextView.text = with.toString()
1820

@@ -29,8 +31,29 @@ class LogsAdapter : RecyclerView.Adapter<LogsAdapter.ViewHolder>() {
2931
var messages: List<LogMessage>
3032
get() = _messages
3133
set(value) {
34+
val result = DiffUtil.calculateDiff(
35+
object : DiffUtil.Callback() {
36+
override fun getOldListSize(): Int =
37+
_messages.size
38+
39+
override fun getNewListSize(): Int =
40+
value.size
41+
42+
override fun areItemsTheSame(
43+
oldItemPosition: Int,
44+
newItemPosition: Int,
45+
): Boolean =
46+
_messages[oldItemPosition].timestamp == value[newItemPosition].timestamp
47+
48+
// contents never change
49+
override fun areContentsTheSame(
50+
oldItemPosition: Int,
51+
newItemPosition: Int,
52+
): Boolean = areItemsTheSame(oldItemPosition, newItemPosition)
53+
}
54+
)
3255
_messages = value.toMutableList()
33-
notifyDataSetChanged()
56+
result.dispatchUpdatesTo(this)
3457
}
3558

3659
private var _messages: MutableList<LogMessage> = mutableListOf()

0 commit comments

Comments
 (0)