-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathRecyclerViewSampleActivity.kt
114 lines (99 loc) · 4.23 KB
/
RecyclerViewSampleActivity.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package com.runa.sample
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import androidx.databinding.ViewDataBinding
import androidx.recyclerview.widget.RecyclerView
import com.rakuten.android.ads.runa.AdLoaderStateListener
import com.rakuten.android.ads.runa.ErrorState
import com.runa.sample.databinding.ActivityMultipleBannerRecyclerviewBinding
import com.runa.sample.databinding.ListRowAdsBinding
import com.runa.sample.databinding.ListRowContentBinding
import com.runa.sample.ContentType.AD
import com.runa.sample.ContentType.CONTENT
import com.squareup.picasso.Picasso
internal class RecyclerViewSampleActivity : AppCompatActivity() {
private val ADSPOT_IDS = arrayOf("21881", "18261", "18262", "18269")
private val INTERVAL = 10
private val binding: ActivityMultipleBannerRecyclerviewBinding by lazy {
ActivityMultipleBannerRecyclerviewBinding.inflate(LayoutInflater.from(this), null, false)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
title = "Multiple Banner Ads in RecyclerView"
binding.recyclerView.apply {
val data = combineData(generateListData(), ADSPOT_IDS.toAdsDataList(), INTERVAL)
adapter = RecyclerViewAdapter(data)
}
}
companion object {
internal fun launch(context: Context) =
context.startActivity(Intent(context, RecyclerViewSampleActivity::class.java))
}
}
internal class RecyclerViewAdapter(
private val items: List<ListData>
) : RecyclerView.Adapter<RecyclerViewAdapter.RowHolder>() {
override fun getItemCount(): Int = items.size
override fun getItemViewType(position: Int): Int = items[position].type.value
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RowHolder =
RowHolder.generate(parent, viewType)
override fun onBindViewHolder(holder: RowHolder, position: Int) {
holder.bind(items[position])
}
/**
* ViewHolder
*/
class RowHolder(view: View) : RecyclerView.ViewHolder(view) {
private val bind = DataBindingUtil.bind<ViewDataBinding>(view)!!
fun bind(data: ListData) = when (data.type) {
CONTENT -> (bind as ListRowContentBinding).apply {
data.contentData?.let { content ->
contentName.text = content.name
Picasso.get()
.load(content.url)
.into(contentImg)
}
}
AD -> (bind as ListRowAdsBinding).apply {
data.adsData?.let { ad ->
adview.apply {
adSpotId = ad.adSpotId
adStateListener = object : AdLoaderStateListener() {
override fun onLoadSuccess(view: View?) {
label.visibility = View.VISIBLE
progress.visibility = View.GONE
}
override fun onLoadFailure(view: View?, errorState: ErrorState) {
label.visibility = View.GONE
adview.visibility = View.GONE
progress.visibility = View.GONE
errorInfo.visibility = View.VISIBLE
errorInfo.text = errorState.toString()
}
}
show()
progress.visibility = View.VISIBLE
}
}
}
}
companion object {
fun generate(parent: ViewGroup, type: Int): RowHolder = when (type) {
CONTENT.value -> R.layout.list_row_content
AD.value -> R.layout.list_row_ads
else -> R.layout.list_row_content
}.run {
LayoutInflater.from(parent.context).inflate(this, parent, false)
}.run {
RowHolder(this)
}
}
}
}