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