文章

RecyclerView开源库

RecyclerView开源库

RecyclerView 开源库

Adapter 库

BRAV

AdapterDelegates

AdapterDelegatesManager

AdapterDelegate 管家,通过 addDelegate() 方法注册 AdapterDelegate;在 AbsDelegationAdapter 中维护了 AdapterDelegatesManager 实例,在对应的方法 getItemViewType()onCreateViewHolder() onBindViewHolder() 调用 AdapterDelegatesManager 中的方法。

可以在 AdapterDelegatesManager 添加一些通用逻辑,如调试信息,如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
class DebugAdapterDelegatesManager<T> : AdapterDelegatesManager<T>() {  
    companion object {  
        const val TAG = "DebugAdapterDelegatesManager"  
    }  
    @SuppressLint("AndroidToastJavaKotlin")  
    override fun onBindViewHolder(  
        items: T & Any,  
        position: Int,  
        viewHolder: RecyclerView.ViewHolder,  
        payloads: MutableList<Any?>?  
    ) {  
        super.onBindViewHolder(items, position, viewHolder, payloads)  
        val delegate = this.getDelegateForViewType(viewHolder.itemViewType)  
        val context = viewHolder.itemView.context  
        val log = "position=$position\n" +  
                "delegate=${delegate?.javaClass?.simpleName}\n" +  
                "context=${context.javaClass.simpleName}\n" +  
                "itemView=${viewHolder.itemView.javaClass.simpleName}\n" +  
                "viewHolder=${viewHolder.javaClass.simpleName}\n" +  
                "payloads=$payloads\n" +  
                "items.size=${(items as? ArrayList<*>)?.size}\n"  
        Logger.i(  
            TAG,  
            "${this.javaClass.simpleName}#onBindViewHolder onLongClick $log\nitems=$items"  
        )  
        viewHolder.itemView.setOnLongClickListener {  
            val builder = AlertDialog.Builder(context)  
            builder.setTitle("Adapter调试信息")  
            builder.setMessage(log)  
  
            builder.setPositiveButton("确定") { dialog, _ ->  
                val clipboardManager =  
                    context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager  
                val clipData = ClipData.newPlainText("label", "$log\n$items")  
                clipboardManager.setPrimaryClip(clipData)  
                Toast.makeText(context, "已复制到剪贴板", Toast.LENGTH_SHORT).show()  
                dialog.dismiss()  
            }  
            builder.setNegativeButton("取消") { dialog, _ ->  
                dialog.dismiss()  
            }  
            val dialog = builder.create()  
            dialog.show()  
            false  
        }  
    }  
}
本文由作者按照 CC BY 4.0 进行授权