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 进行授权