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

115 lines
3.9 KiB
Kotlin

package org.mariotaku.twidere.adapter
import android.content.Context
import androidx.recyclerview.widget.RecyclerView
import android.view.LayoutInflater
import android.view.ViewGroup
import com.bumptech.glide.RequestManager
import org.mariotaku.kpreferences.get
import org.mariotaku.library.objectcursor.ObjectCursor
import org.mariotaku.twidere.adapter.iface.IItemCountsAdapter
import org.mariotaku.twidere.adapter.iface.ILoadMoreSupportAdapter
import org.mariotaku.twidere.constant.nameFirstKey
import org.mariotaku.twidere.exception.UnsupportedCountIndexException
import org.mariotaku.twidere.model.ItemCounts
import org.mariotaku.twidere.model.ParcelableMessageConversation
import org.mariotaku.twidere.view.holder.LoadIndicatorViewHolder
import org.mariotaku.twidere.view.holder.message.MessageEntryViewHolder
/**
* Created by mariotaku on 2017/2/9.
*/
class MessagesEntriesAdapter(
context: Context,
requestManager: RequestManager
) : LoadMoreSupportAdapter<RecyclerView.ViewHolder>(context, requestManager),
IItemCountsAdapter {
override val itemCounts: ItemCounts = ItemCounts(2)
var conversations: List<ParcelableMessageConversation>? = null
set(value) {
field = value
updateItemCounts()
notifyDataSetChanged()
}
var drawAccountColors: Boolean = false
set(value) {
field = value
updateItemCounts()
notifyDataSetChanged()
}
val nameFirst: Boolean = preferences[nameFirstKey]
var listener: MessageConversationClickListener? = null
private val reuseEntry = ParcelableMessageConversation()
override fun getItemCount(): Int {
return itemCounts.itemCount
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when (holder.itemViewType) {
ITEM_TYPE_MESSAGE_ENTRY -> {
val conversation = getConversation(position, reuse = true)
(holder as MessageEntryViewHolder).display(conversation)
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val inflater = LayoutInflater.from(parent.context)
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()
}
override fun getItemViewType(position: Int): Int {
return when (val countIndex = itemCounts.getItemCountIndex(position)) {
0 -> ITEM_TYPE_MESSAGE_ENTRY
1 -> ITEM_VIEW_TYPE_LOAD_INDICATOR
else -> throw UnsupportedCountIndexException(countIndex, position)
}
}
private fun updateItemCounts() {
itemCounts[0] = conversations?.size ?: 0
itemCounts[1] = if (loadMoreIndicatorPosition and ILoadMoreSupportAdapter.END != 0L) 1 else 0
}
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]
}
interface MessageConversationClickListener {
fun onProfileImageClick(position: Int)
fun onConversationClick(position: Int)
fun onConversationLongClick(position: Int): Boolean
}
companion object {
const val ITEM_TYPE_MESSAGE_ENTRY = 1
const val ITEM_VIEW_TYPE_LOAD_INDICATOR = 2
}
}