Twidere-App-Android-Twitter.../twidere/src/main/kotlin/org/mariotaku/twidere/adapter/MessagesEntriesAdapter.kt

115 lines
3.9 KiB
Kotlin
Raw Normal View History

2017-02-09 14:43:51 +01:00
package org.mariotaku.twidere.adapter
import android.content.Context
2020-01-26 08:35:15 +01:00
import androidx.recyclerview.widget.RecyclerView
2017-02-09 14:43:51 +01:00
import android.view.LayoutInflater
import android.view.ViewGroup
2017-03-01 15:12:25 +01:00
import com.bumptech.glide.RequestManager
2017-02-12 15:26:09 +01:00
import org.mariotaku.kpreferences.get
2017-04-28 15:44:45 +02:00
import org.mariotaku.library.objectcursor.ObjectCursor
2017-02-09 14:43:51 +01:00
import org.mariotaku.twidere.adapter.iface.IItemCountsAdapter
2017-02-10 19:01:31 +01:00
import org.mariotaku.twidere.adapter.iface.ILoadMoreSupportAdapter
2017-02-12 15:26:09 +01:00
import org.mariotaku.twidere.constant.nameFirstKey
2017-05-16 04:20:46 +02:00
import org.mariotaku.twidere.exception.UnsupportedCountIndexException
2017-02-09 14:43:51 +01:00
import org.mariotaku.twidere.model.ItemCounts
import org.mariotaku.twidere.model.ParcelableMessageConversation
2017-02-10 19:01:31 +01:00
import org.mariotaku.twidere.view.holder.LoadIndicatorViewHolder
2017-02-10 07:17:48 +01:00
import org.mariotaku.twidere.view.holder.message.MessageEntryViewHolder
2017-02-09 14:43:51 +01:00
/**
* Created by mariotaku on 2017/2/9.
*/
2017-03-01 15:12:25 +01:00
class MessagesEntriesAdapter(
context: Context,
2017-03-02 07:59:19 +01:00
requestManager: RequestManager
) : LoadMoreSupportAdapter<RecyclerView.ViewHolder>(context, requestManager),
2017-02-09 14:43:51 +01:00
IItemCountsAdapter {
2017-02-10 19:01:31 +01:00
override val itemCounts: ItemCounts = ItemCounts(2)
2017-02-09 14:43:51 +01:00
var conversations: List<ParcelableMessageConversation>? = null
set(value) {
field = value
updateItemCounts()
2017-02-09 14:43:51 +01:00
notifyDataSetChanged()
}
var drawAccountColors: Boolean = false
set(value) {
field = value
updateItemCounts()
2017-02-09 14:43:51 +01:00
notifyDataSetChanged()
}
2017-02-12 15:26:09 +01:00
val nameFirst: Boolean = preferences[nameFirstKey]
2017-02-09 14:43:51 +01:00
var listener: MessageConversationClickListener? = null
2017-04-28 15:44:45 +02:00
private val reuseEntry = ParcelableMessageConversation()
2017-02-09 14:43:51 +01:00
override fun getItemCount(): Int {
return itemCounts.itemCount
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when (holder.itemViewType) {
ITEM_TYPE_MESSAGE_ENTRY -> {
2017-04-28 15:44:45 +02:00
val conversation = getConversation(position, reuse = true)
2017-02-10 07:17:48 +01:00
(holder as MessageEntryViewHolder).display(conversation)
2017-02-09 14:43:51 +01:00
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val inflater = LayoutInflater.from(parent.context)
2017-02-10 19:01:31 +01:00
when (viewType) {
ITEM_TYPE_MESSAGE_ENTRY -> {
val itemView = inflater.inflate(MessageEntryViewHolder.layoutResource, parent, false)
return MessageEntryViewHolder(itemView, this)
}
ITEM_VIEW_TYPE_LOAD_INDICATOR -> {
val itemView = inflater.inflate(LoadIndicatorViewHolder.layoutResource, parent, false)
return LoadIndicatorViewHolder(itemView)
}
}
throw UnsupportedOperationException()
2017-02-09 14:43:51 +01:00
}
override fun getItemViewType(position: Int): Int {
2020-06-08 23:19:10 +02:00
return when (val countIndex = itemCounts.getItemCountIndex(position)) {
0 -> ITEM_TYPE_MESSAGE_ENTRY
1 -> ITEM_VIEW_TYPE_LOAD_INDICATOR
2017-05-16 04:20:46 +02:00
else -> throw UnsupportedCountIndexException(countIndex, position)
2017-02-10 19:01:31 +01:00
}
2017-02-09 14:43:51 +01:00
}
private fun updateItemCounts() {
itemCounts[0] = conversations?.size ?: 0
itemCounts[1] = if (loadMoreIndicatorPosition and ILoadMoreSupportAdapter.END != 0L) 1 else 0
}
2017-04-28 15:44:45 +02:00
fun getConversation(position: Int, reuse: Boolean = false): ParcelableMessageConversation {
val conversations = this.conversations!!
val dataPosition = position - itemCounts.getItemStartPosition(0)
if (reuse && conversations is ObjectCursor) {
return conversations.setInto(dataPosition, reuseEntry)
}
return conversations[dataPosition]
2017-02-09 14:43:51 +01:00
}
interface MessageConversationClickListener {
fun onProfileImageClick(position: Int)
fun onConversationClick(position: Int)
2017-03-19 06:07:45 +01:00
fun onConversationLongClick(position: Int): Boolean
2017-02-09 14:43:51 +01:00
}
companion object {
const val ITEM_TYPE_MESSAGE_ENTRY = 1
2017-02-10 19:01:31 +01:00
const val ITEM_VIEW_TYPE_LOAD_INDICATOR = 2
2017-02-09 14:43:51 +01:00
}
2017-02-12 15:26:09 +01:00
2017-02-09 14:43:51 +01:00
}