我的图书馆的RecyclerView如何让其客户自定义行的呈现方式?

问题描述 投票:0回答:1

假设我创建了一个Android库,该库导出了一个片段,该片段在RecyclerView中显示注释。该库具有自己的默认布局实现,以在RecyclerView中呈现注释,但它希望允许使用该布局的任何客户端来自定义注释的呈现方式。

有没有一种设计方法可以做到这一点?要以某种方式创建一个客户端可以调用的方法,该方法将Note对象作为参数,并告诉客户端返回他们要显示的视图?如果是这样,就适配器而言,它将如何工作/调用?

抱歉,该帖子的细节有些不足,但是我不知道还有什么其他结论。如果有任何后续问题,我很乐意回答

android android-recyclerview recycler-adapter
1个回答
0
投票

您可以通过向片段添加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
        }
    }
}

此方法的优点是,例如,如果片段和活动是在配置更改时重新创建的,则该片段仍将能够在调用活动上解析适配器,而无需执行任何操作。

© www.soinside.com 2019 - 2024. All rights reserved.