Kotlin 我目前正在聊天应用程序中实现分页3.0库

Kotlin 我目前正在聊天应用程序中实现分页3.0库,kotlin,android-recyclerview,android-adapter,paging,android-paging-library,Kotlin,Android Recyclerview,Android Adapter,Paging,Android Paging Library,这是我用来在两个用户之间显示文本消息而不使用分页的适配器 class ChatAdapter(private val message: List<ChatMessage>) : RecyclerView.Adapter<RecyclerView.ViewHolder>() { companion object { const val VIEW_TYPE_1 = 1 const val VIEW_TYPE_2 = 2 } private inner cla

这是我用来在两个用户之间显示文本消息而不使用分页的适配器

class ChatAdapter(private val message: List<ChatMessage>) :
RecyclerView.Adapter<RecyclerView.ViewHolder>() {
companion object {
    const val VIEW_TYPE_1 = 1
    const val VIEW_TYPE_2 = 2
}

private inner class View1ViewHolder(itemView: View) :
    RecyclerView.ViewHolder(itemView) {
    val textMessage: TextView = itemView.textMessage
    val messageTimestamp: TextView = itemView.messageTimestamp
    val imageMessage: ImageView = itemView.imageMessage
    val imageCover: ImageView = itemView.imageCover
    val deliveredReceipt: ImageView = itemView.delivered_image
    fun bind(position: Int) {
        setIsRecyclable(false)
        val item = message[position]
        val itemPrev = if (position !== 0) {
            message[position - 1]
        } else message[position]

        if(item.status){
            deliveredReceipt.visibility = View.VISIBLE
        }

        if (item.url == "") {
            textMessage.text = item.text
            if (convertDurationToFormatted(
                    itemPrev.timestamp * 1000,
                    item.timestamp * 1000
                ) || itemPrev == message[position]
            ) {
                messageTimestamp.visibility = View.VISIBLE
                messageTimestamp.text = getDateTime(item.timestamp)
            } else {
                messageTimestamp.visibility = View.GONE
            }

        } else if (item.url !== "") {
            textMessage.visibility = View.GONE
            messageTimestamp.visibility = View.GONE
            Picasso.get().load(item.url).into(imageMessage)
            imageCover.visibility = View.VISIBLE
            imageMessage.visibility = View.VISIBLE
            imageMessage.setOnClickListener {
                val options = arrayOf<CharSequence>(
                    "View Image", "Cancel"
                )

                val builder: AlertDialog.Builder = AlertDialog.Builder(itemView.context)
                builder.setTitle("what now?")
                builder.setItems(options) { _, which ->
                    if (which == 0) {
                        val intent = Intent(builder.context, ViewFullImageActivity::class.java)
                        intent.putExtra("url", item.url)
                        builder.context.startActivity(intent)
                    }
                }
                builder.show()
            }
        }
    }
}

private inner class View2ViewHolder(itemView: View) :
    RecyclerView.ViewHolder(itemView) {
    val textMessage: TextView = itemView.textMessage
    val messageTimestamp: TextView = itemView.messageTimestamp
    val imageMessage: ImageView = itemView.imageMessage
    val imageCover: ImageView = itemView.imageCover
    fun bind(position: Int) {
        setIsRecyclable(false)
        val item = message[position]
        val itemPrev = if (position !== 0) {
            message[position - 1]
        } else message[position]
        if (item.url == "") {
            textMessage.text = item.text
            if (convertDurationToFormatted(
                    itemPrev.timestamp * 1000,
                    item.timestamp * 1000
                ) || itemPrev == message[position]
            ) {
                messageTimestamp.visibility = View.VISIBLE
                messageTimestamp.text = getDateTime(item.timestamp)
            }
        } else if (item.url !== "") {
            textMessage.visibility = View.GONE
            messageTimestamp.visibility = View.GONE
            Picasso.get().load(item.url).into(imageMessage)
            imageCover.visibility = View.VISIBLE
            imageMessage.visibility = View.VISIBLE
            imageMessage.setOnClickListener {
                val options = arrayOf<CharSequence>(
                    "View Image", "Cancel"
                )

                val builder: AlertDialog.Builder = AlertDialog.Builder(itemView.context)
                builder.setTitle("what now?")
                builder.setItems(options) { _, which ->
                    if (which == 0) {
                        val intent = Intent(builder.context, ViewFullImageActivity::class.java)
                        intent.putExtra("url", item.url)
                        builder.context.startActivity(intent)
                    }
                }
                builder.show()
            }
        }
    }
}


override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
    if (viewType == VIEW_TYPE_1) {
        return View1ViewHolder(
            LayoutInflater.from(parent.context).inflate(R.layout.chat_row_to, parent, false)
        )
    }
    return View2ViewHolder(
        LayoutInflater.from(parent.context).inflate(R.layout.chat_row_from, parent, false)
    )
}

override fun getItemCount(): Int = message.size

private fun getDateTime(s: Long): String? {
    return try {
        val sdf = SimpleDateFormat("EEE,hh:mmaa", Locale.getDefault())
        val netDate = Date(s * 1000)
        sdf.format(netDate)
    } catch (e: Exception) {
        e.toString()
    }
}

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
    if (message[position].fromId == Firebase.auth.uid) {
        (holder as View1ViewHolder).bind(position)
    } else {
        (holder as View2ViewHolder).bind(position)
    }
}

override fun getItemViewType(position: Int): Int {
    return if (message[position].fromId == Firebase.auth.uid) {
        VIEW_TYPE_1
    } else {
        VIEW_TYPE_2
    }
}
class ChatAdapter(专用val消息:列表):
RecyclerView.Adapter(){
伴星{
常量值视图类型=1
常量值视图类型2=2
}
私有内部类View1ViewHolder(itemView:View):
RecyclerView.ViewHolder(itemView){
val textMessage:TextView=itemView.textMessage
val messageTimestamp:TextView=itemView.messageTimestamp
val imageMessage:ImageView=itemView.imageMessage
val imageCover:ImageView=itemView.imageCover
val deliveredReceipt:ImageView=itemView.delivered\u图像
趣味绑定(位置:Int){
setIsRecyclable(错误)
val项目=消息[位置]
val itemprov=if(位置!==0){
信息[位置-1]
}else消息[位置]
如果(项目状态){
deliveredReceipt.visibility=View.VISIBLE
}
如果(item.url==“”){
textMessage.text=item.text
如果(转换持续时间到格式)(
itemPrev.timestamp*1000,
item.timestamp*1000
)| | itemprov==消息[位置]
) {
messageTimestamp.visibility=View.visibility
messageTimestamp.text=getDateTime(item.timestamp)
}否则{
messageTimestamp.visibility=View.GONE
}
}else if(item.url!==“”){
textMessage.visibility=View.GONE
messageTimestamp.visibility=View.GONE
Picasso.get().load(item.url).into(imageMessage)
imageCover.visibility=View.VISIBLE
imageMessage.visibility=View.VISIBLE
imageMessage.setOnClickListener{
val options=arrayOf(
“查看图像”、“取消”
)
val builder:AlertDialog.builder=AlertDialog.builder(itemView.context)
builder.setTitle(“现在怎么办?”)
setItems(选项){{u0,其中->
if(which==0){
val intent=intent(builder.context,ViewFullImageActivity::class.java)
intent.putExtra(“url”,item.url)
builder.context.startActivity(intent)
}
}
builder.show()
}
}
}
}
私有内部类View2ViewHolder(项目视图:视图):
RecyclerView.ViewHolder(itemView){
val textMessage:TextView=itemView.textMessage
val messageTimestamp:TextView=itemView.messageTimestamp
val imageMessage:ImageView=itemView.imageMessage
val imageCover:ImageView=itemView.imageCover
趣味绑定(位置:Int){
setIsRecyclable(错误)
val项目=消息[位置]
val itemprov=if(位置!==0){
信息[位置-1]
}else消息[位置]
如果(item.url==“”){
textMessage.text=item.text
如果(转换持续时间到格式)(
itemPrev.timestamp*1000,
item.timestamp*1000
)| | itemprov==消息[位置]
) {
messageTimestamp.visibility=View.visibility
messageTimestamp.text=getDateTime(item.timestamp)
}
}else if(item.url!==“”){
textMessage.visibility=View.GONE
messageTimestamp.visibility=View.GONE
Picasso.get().load(item.url).into(imageMessage)
imageCover.visibility=View.VISIBLE
imageMessage.visibility=View.VISIBLE
imageMessage.setOnClickListener{
val options=arrayOf(
“查看图像”、“取消”
)
val builder:AlertDialog.builder=AlertDialog.builder(itemView.context)
builder.setTitle(“现在怎么办?”)
setItems(选项){{u0,其中->
if(which==0){
val intent=intent(builder.context,ViewFullImageActivity::class.java)
intent.putExtra(“url”,item.url)
builder.context.startActivity(intent)
}
}
builder.show()
}
}
}
}
override fun onCreateViewHolder(父级:ViewGroup,viewType:Int):RecyclerView.ViewHolder{
如果(视图类型==视图类型1){
返回视图1视图保持器(
LayoutFlater.from(parent.context).充气(R.layout.chat\u row\u to,parent,false)
)
}
返回View2ViewHolder(
LayoutFlater.from(parent.context)。充气(R.layout.chat\u row\u from,parent,false)
)
}
重写getItemCount():Int=message.size
private fun getDateTime(s:Long):字符串{
回击{
val sdf=SimpleDataFormat(“EEE,hh:mmaa”,Locale.getDefault())
val netDate=日期(s*1000)
sdf.format(netDate)
}捕获(e:例外){
e、 toString()
}
}
覆盖onBindViewHolder(holder:RecyclerView.ViewHolder,位置:Int){
if(消息[position].fromId==Firebase.auth.uid){
(支架为View1ViewHolder)。绑定(位置)
}否则{
(支架为View2ViewHolder)。绑定(位置)
}
}
覆盖getItemViewType(位置:Int):Int{
返回if(消息[position].fromId==Firebase.auth.uid){
视图类型1
}否则{
视图类型2
}
}
}

现在我必须转到分页数据适配器。 如何像在上面的适配器中那样在其中使用多种视图类型

在示例适配器下面附加扩展分页数据适配器

class UserAdapter(diffCallback: DiffUtil.ItemCallback<User>) :
  PagingDataAdapter<User, UserViewHolder>(diffCallback) {
  override fun onCreateViewHolder(
    parent: ViewGroup,
    viewType: Int
  ): UserViewHolder {
    return UserViewHolder(parent)
  }

  override fun onBindViewHolder(holder: UserViewHolder, position: Int) {
    val item = getItem(position)
    // Note that item may be null. ViewHolder must support binding a
    // null item as a placeholder.
    holder.bind(item)
  }
}
类UserAdapter(diffCallback:DiffUtil.ItemCallback): PagingDataAdapter(diffCallback){ 覆盖视图保持器( 父对象:视图组, 视图类型:Int ):UserViewHolde