1
+ package org.ninetripods.mq.study.base.adapter
2
+
3
+ import android.view.ViewGroup
4
+ import androidx.recyclerview.widget.DiffUtil
5
+ import androidx.recyclerview.widget.ListAdapter
6
+ import androidx.recyclerview.widget.RecyclerView
7
+ import org.ninetripods.mq.study.chatgpt.ChatDiffUtil
8
+
9
+ /* *
10
+ * Created by mq on 2023/7/20
11
+ * RecyclerView.Adapter基类
12
+ */
13
+ open class BaseAdapter <T : Any >(private val vhFactory : IVHFactory ) :
14
+ RecyclerView .Adapter <BaseVHolder <T >>() {
15
+ private val models = mutableListOf<T >()
16
+
17
+ override fun getItemViewType (position : Int ): Int {
18
+ val model = models[position]
19
+ if (model is IMultiType ) return model.getItemViewType()
20
+ return super .getItemViewType(position)
21
+ }
22
+
23
+ override fun onCreateViewHolder (parent : ViewGroup , viewType : Int ): BaseVHolder <T > {
24
+ return vhFactory.getVH(parent.context, parent, viewType) as BaseVHolder <T >
25
+ }
26
+
27
+ override fun getItemCount (): Int = models.size
28
+
29
+ override fun onBindViewHolder (holder : BaseVHolder <T >, position : Int ) {
30
+ holder.onBindViewHolder(models[position], position)
31
+ }
32
+
33
+ fun submit (item : T ) {
34
+
35
+ }
36
+
37
+ fun submitList (newList : List <T >) {
38
+ // 传入新旧数据进行比对
39
+ val diffUtil = ChatDiffUtil (models, newList)
40
+ // 经过比对得到差异结果
41
+ val diffResult = DiffUtil .calculateDiff(diffUtil)
42
+ // NOTE:注意这里要重新设置Adapter中的数据
43
+ models.clear()
44
+ models.addAll(newList)
45
+ // 将数据传给adapter,最终通过adapter.notifyItemXXX更新数据
46
+ diffResult.dispatchUpdatesTo(this )
47
+ }
48
+ }
49
+
50
+ /* *
51
+ * 使用DiffUtil的ListAdapter,其父类还是RecyclerView.Adapter
52
+ * @param diff DiffUtil.Callback主要用于比较新旧列表差异,并处理插入、删除和移动等操作;
53
+ * 而 DiffUtil.ItemCallBack只关注当前位置处的对象是否发生改变。我们应该根据具体情况选择合适的接口来实现数据更新检查并且以最高效率达成目标 。
54
+ */
55
+ class BaseListAdapter <T >(diff : DiffUtil .ItemCallback <T >, private val vhFactory : IVHFactory ) :
56
+ ListAdapter <T , BaseVHolder <T >>(diff) {
57
+
58
+ override fun onCreateViewHolder (parent : ViewGroup , viewType : Int ): BaseVHolder <T > {
59
+ return vhFactory.getVH(parent.context, parent, viewType) as BaseVHolder <T >
60
+ }
61
+
62
+ override fun onBindViewHolder (holder : BaseVHolder <T >, position : Int ) {
63
+ holder.onBindViewHolder(currentList[position], position)
64
+ }
65
+
66
+ fun submit (models : List <T >) {
67
+ submitList(models)
68
+ }
69
+ }
0 commit comments