Skip to content

Commit a8cf311

Browse files
Simplify usage by remove ViewHolder
1 parent 173dd0b commit a8cf311

File tree

25 files changed

+297
-275
lines changed

25 files changed

+297
-275
lines changed

loadingstateview-ktx/build.gradle

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ android {
2626
}
2727
kotlinOptions {
2828
jvmTarget = '1.8'
29-
freeCompilerArgs += "-Xcontext-receivers"
3029
}
3130
}
3231

loadingstateview-ktx/src/main/java/com/dylanc/loadingstateview/LoadingState.kt

Lines changed: 40 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,22 @@ package com.dylanc.loadingstateview
1919
import android.app.Activity
2020
import android.view.View
2121
import android.view.ViewGroup
22+
import androidx.annotation.StringRes
2223
import androidx.fragment.app.Fragment
2324

2425
interface LoadingState : LoadingStateView.OnReloadListener {
25-
val loadingStateView: LoadingStateView?
2626
fun Activity.decorateContentView(isDecorated: Boolean = true)
2727
fun View.decorateWithLoadingState(isDecorated: Boolean = true): View
28-
fun registerView(vararg viewDelegates: LoadingStateView.ViewDelegate<*>)
29-
fun <T : LoadingStateView.ViewHolder> updateView(viewType: Any, block: LoadingStateView.Callback<T>)
30-
fun Activity.setHeaders(vararg delegates: LoadingStateView.ViewDelegate<*>)
31-
fun Fragment.setHeaders(vararg delegates: LoadingStateView.ViewDelegate<*>)
28+
fun registerView(vararg viewDelegates: LoadingStateView.ViewDelegate)
29+
fun Activity.setToolbar(@StringRes titleId: Int, navBtnType: NavBtnType = NavBtnType.ICON, block: (ToolbarConfig.() -> Unit)? = null)
30+
fun Activity.setToolbar(title: String? = null, navBtnType: NavBtnType = NavBtnType.ICON, block: (ToolbarConfig.() -> Unit)? = null)
31+
fun Fragment.setToolbar(@StringRes titleId: Int, navBtnType: NavBtnType = NavBtnType.ICON, block: (ToolbarConfig.() -> Unit)? = null)
32+
fun Fragment.setToolbar(title: String? = null, navBtnType: NavBtnType = NavBtnType.ICON, block: (ToolbarConfig.() -> Unit)? = null)
33+
fun Activity.setHeaders(vararg delegates: LoadingStateView.ViewDelegate)
34+
fun Fragment.setHeaders(vararg delegates: LoadingStateView.ViewDelegate)
35+
fun <T : LoadingStateView.ViewDelegate> updateView(viewType: Any, block: T.() -> Unit)
36+
fun Activity.updateToolbar(block: ToolbarConfig.() -> Unit)
37+
fun Fragment.updateToolbar(block: ToolbarConfig.() -> Unit)
3238
fun showLoadingView()
3339
fun showContentView()
3440
fun showErrorView()
@@ -37,8 +43,7 @@ interface LoadingState : LoadingStateView.OnReloadListener {
3743
}
3844

3945
class LoadingStateImpl : LoadingState {
40-
override var loadingStateView: LoadingStateView? = null
41-
private set
46+
private var loadingStateView: LoadingStateView? = null
4247

4348
override fun Activity.decorateContentView(isDecorated: Boolean) {
4449
findViewById<ViewGroup>(android.R.id.content).getChildAt(0)
@@ -47,30 +52,49 @@ class LoadingStateImpl : LoadingState {
4752

4853
override fun View.decorateWithLoadingState(isDecorated: Boolean): View {
4954
return if (isDecorated) {
50-
loadingStateView = LoadingStateView(this)
51-
.apply { setOnReloadListener(::onReload) }
52-
loadingStateView!!.decorView
55+
LoadingStateView(this).apply {
56+
setOnReloadListener(::onReload)
57+
loadingStateView = this
58+
}.decorView
5359
} else {
5460
this
5561
}
5662
}
5763

58-
override fun registerView(vararg viewDelegates: LoadingStateView.ViewDelegate<*>) {
64+
override fun registerView(vararg viewDelegates: LoadingStateView.ViewDelegate) {
5965
loadingStateView?.register(*viewDelegates)
6066
}
6167

62-
override fun <T : LoadingStateView.ViewHolder> updateView(viewType: Any, block: LoadingStateView.Callback<T>) {
63-
loadingStateView?.updateView(viewType, block)
64-
}
68+
override fun Activity.setToolbar(@StringRes titleId: Int, navBtnType: NavBtnType, block: (ToolbarConfig.() -> Unit)?) =
69+
setToolbar(getString(titleId), navBtnType, block)
70+
71+
override fun Activity.setToolbar(title: String?, navBtnType: NavBtnType, block: (ToolbarConfig.() -> Unit)?) =
72+
setHeaders(ToolbarViewDelegate(title, navBtnType, block))
73+
74+
override fun Fragment.setToolbar(@StringRes titleId: Int, navBtnType: NavBtnType, block: (ToolbarConfig.() -> Unit)?) =
75+
setToolbar(getString(titleId), navBtnType, block)
76+
77+
override fun Fragment.setToolbar(title: String?, navBtnType: NavBtnType, block: (ToolbarConfig.() -> Unit)?) =
78+
setHeaders(ToolbarViewDelegate(title, navBtnType, block))
6579

66-
override fun Activity.setHeaders(vararg delegates: LoadingStateView.ViewDelegate<*>) {
80+
override fun Activity.setHeaders(vararg delegates: LoadingStateView.ViewDelegate) {
6781
loadingStateView?.setDecorHeader(*delegates)
6882
}
6983

70-
override fun Fragment.setHeaders(vararg delegates: LoadingStateView.ViewDelegate<*>) {
84+
override fun Fragment.setHeaders(vararg delegates: LoadingStateView.ViewDelegate) {
7185
loadingStateView?.addChildDecorHeader(*delegates)
7286
}
7387

88+
override fun Activity.updateToolbar(block: ToolbarConfig.() -> Unit) =
89+
updateView<ToolbarViewDelegate>(ViewType.TITLE) { bind(config.apply(block)) }
90+
91+
override fun Fragment.updateToolbar(block: ToolbarConfig.() -> Unit) =
92+
updateView<ToolbarViewDelegate>(ViewType.TITLE) { bind(config.apply(block)) }
93+
94+
override fun <T : LoadingStateView.ViewDelegate> updateView(viewType: Any, block: T.() -> Unit) {
95+
loadingStateView?.getViewDelegate<T>(viewType)?.apply(block)
96+
}
97+
7498
override fun showLoadingView() {
7599
loadingStateView?.showLoadingView()
76100
}

loadingstateview-toolbar/src/main/java/com/dylanc/loadingstateview/toolbar/ToolbarConfig.kt renamed to loadingstateview-ktx/src/main/java/com/dylanc/loadingstateview/ToolbarConfig.kt

Lines changed: 31 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
@file:Suppress("unused")
22

3-
package com.dylanc.loadingstateview.toolbar
3+
package com.dylanc.loadingstateview
44

55
import android.app.Activity
6-
import android.graphics.Color
76
import android.view.View
87
import androidx.annotation.ColorInt
98
import androidx.annotation.DrawableRes
@@ -15,66 +14,75 @@ enum class NavBtnType {
1514
open class ToolbarConfig(
1615
var title: String? = null,
1716
var navBtnType: NavBtnType = NavBtnType.ICON,
18-
1917
var navText: String? = null,
20-
@DrawableRes var navIcon: Int = ToolbarUI.leftIcon,
18+
@DrawableRes var navIcon: Int = ToolbarUI.navIcon,
2119
var navClickListener: View.OnClickListener = View.OnClickListener {
2220
if (it.context is Activity) (it.context as Activity).finish()
2321
},
24-
2522
@DrawableRes var rightIcon: Int = -1,
2623
var rightText: String? = null,
2724
var rightClickListener: View.OnClickListener? = null,
28-
2925
@DrawableRes var rightSecondIcon: Int = -1,
30-
var rightSecondText: String? = null,
3126
var rightSecondClickListener: View.OnClickListener? = null,
32-
3327
var height: Float = ToolbarUI.height,
3428
var titleTextSize: Float = ToolbarUI.titleTextSize,
29+
var rightTextSize: Float = ToolbarUI.rightTextSize,
30+
var rightSecondTextSize: Float = ToolbarUI.rightSecondTextSize,
3531
@ColorInt var titleTextColor: Int = ToolbarUI.titleTextColor,
36-
@ColorInt var backgroundColor: Int = ToolbarUI.backgroundColor
32+
@ColorInt var navTextColor: Int = ToolbarUI.navTextColor,
33+
@ColorInt var rightTextColor: Int = ToolbarUI.rightTextColor,
34+
@ColorInt var backgroundColor: Int = ToolbarUI.backgroundColor,
35+
var navIconSize: Float = ToolbarUI.navIconSize,
36+
var rightIconSize: Float = ToolbarUI.rightIconSize,
37+
var rightSecondIconSize: Float = ToolbarUI.rightSecondIconSize,
3738
)
3839

39-
fun ToolbarConfig.setNavText(text: String, listener: View.OnClickListener) {
40+
fun ToolbarConfig.navText(text: String, listener: View.OnClickListener) {
4041
navText = text
4142
navClickListener = listener
4243
}
4344

44-
fun ToolbarConfig.setNavIcon(@DrawableRes icon: Int, listener: View.OnClickListener) {
45+
fun ToolbarConfig.navIcon(@DrawableRes icon: Int, listener: View.OnClickListener) {
4546
navIcon = icon
4647
navClickListener = listener
4748
}
4849

49-
fun ToolbarConfig.setRightIcon(@DrawableRes icon: Int, listener: View.OnClickListener) {
50+
fun ToolbarConfig.rightIcon(@DrawableRes icon: Int, listener: View.OnClickListener) {
5051
rightIcon = icon
5152
rightClickListener = listener
5253
}
53-
fun ToolbarConfig.setRightText(text: String, listener: View.OnClickListener) {
54+
55+
fun ToolbarConfig.rightText(text: String, listener: View.OnClickListener) {
5456
rightText = text
5557
rightClickListener = listener
5658
}
5759

58-
fun ToolbarConfig.setRightSecondText(text: String, listener: View.OnClickListener) {
59-
rightSecondText = text
60-
rightSecondClickListener = listener
61-
}
62-
63-
fun ToolbarConfig.setRightSecondIcon(@DrawableRes icon: Int, listener: View.OnClickListener) {
60+
fun ToolbarConfig.rightSecondIcon(@DrawableRes icon: Int, listener: View.OnClickListener) {
6461
rightSecondIcon = icon
6562
rightSecondClickListener = listener
6663
}
6764

6865
object ToolbarUI {
6966
var height = -1f
70-
var titleTextSize = 18f
67+
var titleTextSize = -1f
68+
var rightTextSize = -1f
69+
var rightSecondTextSize = -1f
70+
71+
@ColorInt
72+
var titleTextColor = -1
73+
74+
@ColorInt
75+
var navTextColor = -1
7176

7277
@ColorInt
73-
var titleTextColor = Color.BLACK
78+
var rightTextColor = -1
7479

7580
@ColorInt
76-
var backgroundColor = Color.WHITE
81+
var backgroundColor = -1
7782

7883
@DrawableRes
79-
var leftIcon: Int = R.drawable.ic_arrow_back_ios
84+
var navIcon: Int = -1
85+
var navIconSize = -1f
86+
var rightIconSize = -1f
87+
var rightSecondIconSize = -1f
8088
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
@file:Suppress("unused")
2+
3+
package com.dylanc.loadingstateview
4+
5+
import android.view.LayoutInflater
6+
import android.view.View
7+
import android.view.ViewGroup
8+
9+
typealias ToolbarFactory = () -> ToolbarViewDelegate
10+
11+
lateinit var toolbarFactory: ToolbarFactory
12+
13+
fun ToolbarViewDelegate(title: String? = null, navBtnType: NavBtnType = NavBtnType.ICON, block: (ToolbarConfig.() -> Unit)? = null) =
14+
toolbarFactory().apply { config = ToolbarConfig(title, navBtnType).apply { block?.invoke(this) } }
15+
16+
abstract class ToolbarViewDelegate : LoadingStateView.ViewDelegate(ViewType.TITLE) {
17+
internal lateinit var config: ToolbarConfig
18+
19+
override fun onCreateView(inflater: LayoutInflater, parent: ViewGroup) =
20+
onCreateToolbar(inflater, parent).apply { bind(config) }
21+
22+
abstract fun onCreateToolbar(inflater: LayoutInflater, parent: ViewGroup): View
23+
24+
abstract fun bind(config: ToolbarConfig)
25+
}

loadingstateview-toolbar/build.gradle

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ android {
2626
}
2727
kotlinOptions {
2828
jvmTarget = '1.8'
29-
freeCompilerArgs += "-Xcontext-receivers"
3029
}
3130
viewBinding {
3231
enabled true

loadingstateview-toolbar/src/main/java/com/dylanc/loadingstateview/toolbar/SimpleToolbarViewDelegate.kt

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,26 @@ package com.dylanc.loadingstateview.toolbar
33
import android.view.LayoutInflater
44
import android.view.View
55
import android.view.ViewGroup
6+
import com.dylanc.loadingstateview.NavBtnType
7+
import com.dylanc.loadingstateview.ToolbarConfig
8+
import com.dylanc.loadingstateview.ToolbarViewDelegate
69
import com.dylanc.loadingstateview.toolbar.databinding.LayoutToolbarBinding
710

811
class SimpleToolbarViewDelegate : ToolbarViewDelegate() {
912
private lateinit var binding: LayoutToolbarBinding
1013

11-
override fun onCreateView(inflater: LayoutInflater, parent: ViewGroup): View {
14+
override fun onCreateToolbar(inflater: LayoutInflater, parent: ViewGroup): View {
1215
binding = LayoutToolbarBinding.inflate(inflater, parent, false)
1316
return binding.root
1417
}
1518

16-
override fun onBindView(view: View, config: ToolbarConfig) {
19+
override fun bind(config: ToolbarConfig) {
1720
binding.apply {
1821
tvTitle.text = config.title
22+
1923
when (config.navBtnType) {
2024
NavBtnType.ICON -> {
21-
ivLeft.setImageResource(config.navIcon)
25+
if (config.navIcon > 0) ivLeft.setImageResource(config.navIcon)
2226
ivLeft.setOnClickListener(config.navClickListener)
2327
tvLeft.visibility = View.GONE
2428
ivLeft.visibility = View.VISIBLE
@@ -29,19 +33,43 @@ class SimpleToolbarViewDelegate : ToolbarViewDelegate() {
2933
tvLeft.visibility = View.VISIBLE
3034
ivLeft.visibility = View.GONE
3135
}
32-
NavBtnType.ICON_TEXT->{
33-
ivLeft.setImageResource(config.navIcon)
36+
NavBtnType.ICON_TEXT -> {
37+
if (config.navIcon > 0) ivLeft.setImageResource(config.navIcon)
3438
tvLeft.text = config.navText
3539
ivLeft.setOnClickListener(config.navClickListener)
3640
tvLeft.setOnClickListener(config.navClickListener)
3741
tvLeft.visibility = View.VISIBLE
3842
ivLeft.visibility = View.VISIBLE
3943
}
40-
NavBtnType.NONE-> {
44+
NavBtnType.NONE -> {
4145
ivLeft.visibility = View.GONE
4246
tvLeft.visibility = View.GONE
4347
}
4448
}
4549
}
50+
51+
if (config.rightText != null) {
52+
binding.tvRight.text = config.rightText
53+
binding.tvRight.setOnClickListener(config.rightClickListener)
54+
binding.tvRight.visibility = View.VISIBLE
55+
} else {
56+
binding.tvRight.visibility = View.GONE
57+
}
58+
59+
if (config.rightIcon > 0) {
60+
binding.ivRight.setImageResource(config.rightIcon)
61+
binding.ivRight.setOnClickListener(config.rightClickListener)
62+
binding.ivRight.visibility = View.VISIBLE
63+
} else {
64+
binding.ivRight.visibility = View.GONE
65+
}
66+
67+
if (config.rightSecondIcon > 0) {
68+
binding.ivRightSecond.setImageResource(config.rightSecondIcon)
69+
binding.ivRightSecond.setOnClickListener(config.rightSecondClickListener)
70+
binding.ivRightSecond.visibility = View.VISIBLE
71+
} else {
72+
binding.ivRightSecond.visibility = View.GONE
73+
}
4674
}
4775
}

loadingstateview-toolbar/src/main/java/com/dylanc/loadingstateview/toolbar/ToolbarViewDelegate.kt

Lines changed: 0 additions & 58 deletions
This file was deleted.

0 commit comments

Comments
 (0)