Skip to content

Instantly share code, notes, and snippets.

View DjakaTechnology's full-sized avatar
🏠

Djaka Pradana Jaya Priambudi DjakaTechnology

🏠
View GitHub Profile
interface AdapterDelegate <T> {
fun isForViewType(items: List<T>, position: Int): Boolean
fun onCreateViewHolder(parent: ViewGroup): RecyclerView.ViewHolder
fun onBindViewHolder(items: List<T>, position: Int, holder: RecyclerView.ViewHolder)
}
class AdapterDelegateManager<T> {
private val delegates = mutableListOf<AdapterDelegate<T>>()
fun addDelegate(delegate: AdapterDelegate<T>) {
delegates.add(delegate)
}
fun getItemViewType(items: List<T>, position: Int): Int {
delegates.forEachIndexed { index, it -> if (it.isForViewType(items, position)) return index }
class GenericAdapter<T>(var items: List<T>) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private val delegateManager = AdapterDelegateManager<T>()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return delegateManager.onCreateViewHolder(parent, viewType)
}
override fun getItemCount(): Int {
return items.size
class FeedAdapterOld(var items: List<FeedItem> = listOf()) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
override fun getItemViewType(position: Int): Int {
return when(items[position]) {
is FeedPostItem -> ITEM_POST_ID
is FeedStandardItem -> ITEM_STANDARD_ID
is FeedStoryItem -> ITEM_STORY_ID
else -> -1
}
}
@DjakaTechnology
DjakaTechnology / FeedAdapterOld.kt
Created January 15, 2020 16:29
FeedAdapterWIthoutStories
class FeedAdapterOld(var items: List<FeedItem> = listOf()) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
override fun getItemViewType(position: Int): Int {
return when(items[position]) {
is FeedPostItem -> ITEM_POST_ID
is FeedStandardItem -> ITEM_STANDARD_ID
else -> -1
}
}
class FeedPostAdapterDelegate : AdapterDelegate<FeedItem> {
override fun isForViewType(items: List<FeedItem>, position: Int): Boolean {
return items[position] is FeedPostItem
}
override fun onCreateViewHolder(parent: ViewGroup): RecyclerView.ViewHolder {
return ItemPostViewHolder(
LayoutInflater.from(parent.context).inflate(R.layout.feed_post_item, parent, false)
)
}
class FeedStandardAdapterDelegate : AdapterDelegate<FeedItem> {
override fun isForViewType(items: List<FeedItem>, position: Int): Boolean {
return items[position] is FeedStandardItem
}
override fun onCreateViewHolder(parent: ViewGroup): RecyclerView.ViewHolder {
return ItemStandardViewHolder(
LayoutInflater.from(parent.context).inflate(R.layout.feed_standard_item, parent, false)
)
}
class FeedStoryAdapterDelegate : AdapterDelegate<FeedItem> {
override fun isForViewType(items: List<FeedItem>, position: Int): Boolean {
return items[position] is FeedStoryItem
}
override fun onCreateViewHolder(parent: ViewGroup): RecyclerView.ViewHolder {
return ItemStoryViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.feed_story_item, parent, false))
}
override fun onBindViewHolder(items: List<FeedItem>, position: Int, holder: RecyclerView.ViewHolder) {
//If you dont want to use GenericAdapter
class FeedAdapter(var items: List<FeedItem>) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private val delegateManager = AdapterDelegateManager<FeedItem>()
init {
delegateManager.run {
addDelegate(FeedPostAdapterDelegate())
addDelegate(FeedStandardAdapterDelegate())
addDelegate(FeedStoryAdapterDelegate())
class WithoutHolderActivity : AppCompatActivity() {
private val adapter = GenericAdapter(Utils.getFeedItems())
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_without_holder)
initAdapter()
initRV()
}