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

121 lines
4.2 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.twidere.R
import org.mariotaku.twidere.adapter.iface.ILoadMoreSupportAdapter
import org.mariotaku.twidere.alias.ItemClickListener
import org.mariotaku.twidere.model.ParcelableHashtag
import org.mariotaku.twidere.model.ParcelableStatus
import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.model.ParcelableUserList
import org.mariotaku.twidere.util.StatusAdapterLinkClickHandler
import org.mariotaku.twidere.util.TwidereLinkify
import org.mariotaku.twidere.view.holder.HashtagViewHolder
import org.mariotaku.twidere.view.holder.StatusViewHolder
import org.mariotaku.twidere.view.holder.UserListViewHolder
import org.mariotaku.twidere.view.holder.UserViewHolder
/**
* Created by mariotaku on 16/3/20.
*/
class VariousItemsAdapter(
context: Context,
requestManager: RequestManager
) : LoadMoreSupportAdapter<RecyclerView.ViewHolder>(context, requestManager) {
private val inflater = LayoutInflater.from(context)
val dummyAdapter: DummyItemAdapter
var hashtagClickListener: ItemClickListener? = null
private var data: List<*>? = null
init {
val handler = StatusAdapterLinkClickHandler<Any>(context,
preferences)
dummyAdapter = DummyItemAdapter(context, TwidereLinkify(handler), this, requestManager)
handler.setAdapter(dummyAdapter)
dummyAdapter.updateOptions()
loadMoreIndicatorPosition = ILoadMoreSupportAdapter.NONE
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
when (viewType) {
VIEW_TYPE_STATUS -> {
return ListParcelableStatusesAdapter.createStatusViewHolder(dummyAdapter,
inflater, parent)
}
VIEW_TYPE_USER -> {
return ParcelableUsersAdapter.createUserViewHolder(dummyAdapter, inflater, parent)
}
VIEW_TYPE_USER_LIST -> {
return ParcelableUserListsAdapter.createUserListViewHolder(dummyAdapter, inflater,
parent)
}
VIEW_TYPE_HASHTAG -> {
val view = inflater.inflate(R.layout.list_item_two_line_small, parent, false)
return HashtagViewHolder(view, hashtagClickListener)
}
}
throw UnsupportedOperationException()
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
val obj = getItem(position)
when (holder.itemViewType) {
VIEW_TYPE_STATUS -> {
(holder as StatusViewHolder).display(obj as ParcelableStatus,
displayInReplyTo = true)
}
VIEW_TYPE_USER -> {
(holder as UserViewHolder).display(obj as ParcelableUser)
}
VIEW_TYPE_USER_LIST -> {
(holder as UserListViewHolder).display(obj as ParcelableUserList)
}
VIEW_TYPE_HASHTAG -> {
(holder as HashtagViewHolder).display(obj as ParcelableHashtag)
}
}
}
override fun getItemViewType(position: Int): Int {
return getItemViewType(getItem(position))
}
private fun getItemViewType(obj: Any): Int {
return when (obj) {
is ParcelableStatus -> VIEW_TYPE_STATUS
is ParcelableUser -> VIEW_TYPE_USER
is ParcelableUserList -> VIEW_TYPE_USER_LIST
is ParcelableHashtag -> VIEW_TYPE_HASHTAG
else -> throw UnsupportedOperationException("Unsupported object $obj")
}
}
fun setData(data: List<*>?) {
this.data = data
notifyDataSetChanged()
}
override fun getItemCount(): Int {
if (data == null) return 0
return data!!.size
}
fun getItem(position: Int): Any {
return data!![position]!!
}
companion object {
const val VIEW_TYPE_STATUS = 1
const val VIEW_TYPE_USER = 2
const val VIEW_TYPE_USER_LIST = 3
const val VIEW_TYPE_HASHTAG = 4
}
}