假设我创建了一个Android库,该库导出了一个片段,该片段在RecyclerView中显示注释。该库具有自己的默认布局实现,以在RecyclerView中呈现注释,但它希望允许使用该布局的任何客户端来自定义注释的呈现方式。
有没有一种设计方法可以做到这一点?要以某种方式创建一个客户端可以调用的方法,该方法将Note对象作为参数,并告诉客户端返回他们要显示的视图?如果是这样,就适配器而言,它将如何工作/调用?
抱歉,该帖子的细节有些不足,但是我不知道还有什么其他结论。如果有任何后续问题,我很乐意回答
您可以通过向片段添加setAdapter
方法,让用户在片段实例上设置自定义适配器。
或者,您可以创建一个可选的回调,该回调允许用户自定义笔记视图持有人的创建。这是一个例子:
class NoteFragment : Fragment(), NoteAdapter {
private val notes = mutableListOf<Note>()
// This is used to resolve the note adapter from the calling activity or fragment,
// or if none is found, use the default note adapter.
private val noteAdapter: NoteAdapter
get() = (parentFragment as? NoteAdapter)
?: (targetFragment as? NoteAdapter)
?: (activity as? NoteAdapter)
?: this
// This method provides the default view holder used for note items.
override fun createNoteViewHolder(inflater: LayoutInflater, parent: ViewGroup) =
DefaultNoteViewHolder(inflater.inflate(R.layout.default_note_view, parent, false))
abstract class NoteViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
/** In this method, the view holder views should be bound with the information of the [note]. */
abstract fun bind(note: Note)
}
private inner class Adapter : RecyclerView.Adapter<NoteViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NoteViewHolder {
val inflater = LayoutInflater.from(parent.context)
return noteAdapter.createNoteViewHolder(inflater, parent)
}
override fun onBindViewHolder(holder: NoteViewHolder, pos: Int) {
holder.bind(notes[pos])
}
override fun getItemCount() = notes.size
}
class DefaultNoteViewHolder(itemView: View) : NoteViewHolder(itemView) {
override fun bind(note: Note) {
// Default view binding
}
}
}
/** Interface to be implemented by the calling activity or fragment. */
interface NoteAdapter {
fun createNoteViewHolder(inflater: LayoutInflater, parent: ViewGroup): MyFragment.NoteViewHolder
}
data class Note(val message: String)
片段首先尝试从调用活动或片段中找到NoteAdapter
,然后如果失败,它将使用默认实现,该默认实现由片段本身提供,因为它实现了NoteAdapter
接口。
这是使用活动中的片段的人如何自定义笔记项目的绑定:
class MyActivity : AppCompatActivity(), NoteAdapter {
// ...
override fun createNoteViewHolder(inflater: LayoutInflater, parent: ViewGroup)
= CustomNoteViewHolder(inflater.inflate(R.layout.custom_note_view, parent, false))
class CustomNoteViewHolder(itemView: View) : NoteViewHolder(itemView) {
override fun bind(note: Note) {
// Custom view binding behavior
}
}
}
此方法的优点是,例如,如果片段和活动是在配置更改时重新创建的,则该片段仍将能够在调用活动上解析适配器,而无需执行任何操作。