问题描述
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 (将#修改为@)