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

问题描述

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

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",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,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 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)
  }
}

从上面可以清楚地看出,我在用户发送和接收消息时使用了不同的视图持有者。在分页数据适配器中可以做类似的事情吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...