@@ -4,10 +4,13 @@ import android.content.Context
44import android.graphics.Rect
55import android.util.AttributeSet
66import android.view.View
7+ import android.view.ViewGroup
78import android.view.ViewStub
89import android.view.ViewTreeObserver
910import android.view.ViewTreeObserver.OnGlobalLayoutListener
11+ import android.widget.ImageView
1012import android.widget.LinearLayout
13+ import android.widget.TextView
1114
1215class LazyLoadComponent @JvmOverloads constructor(
1316 context : Context , attrs : AttributeSet ? = null
@@ -29,7 +32,10 @@ class LazyLoadComponent @JvmOverloads constructor(
2932 private var screenHeight = - 1
3033 private var parentResId = - 1
3134 private var isInflated = false
35+ private var resetPaddingFlag = false
3236 private lateinit var parentView: View
37+ private var imageView: ImageView ? = null
38+ private var textView: TextView ? = null
3339
3440 init {
3541 orientation = VERTICAL
@@ -40,7 +46,13 @@ class LazyLoadComponent @JvmOverloads constructor(
4046 try {
4147 parentResId =
4248 typeArray.getResourceId(R .styleable.LazyLoadComponent_parent_layout_id , - 1 )
49+ resetPaddingFlag =
50+ typeArray.getBoolean(R .styleable.LazyLoadComponent_reset_padding_on_load , false )
4351 val layoutRes = typeArray.getResourceId(R .styleable.LazyLoadComponent_layout_res , - 1 )
52+ val imagePlaceholderRes =
53+ typeArray.getResourceId(R .styleable.LazyLoadComponent_image_placeholder , - 1 )
54+ val textPlaceHolder =
55+ typeArray.getString(R .styleable.LazyLoadComponent_text_placeholder ).orEmpty()
4456 if (layoutRes == - 1 ) {
4557 throw IllegalArgumentException (LAYOUT_RESOURCE_IS_INVALID )
4658 }
@@ -51,17 +63,40 @@ class LazyLoadComponent @JvmOverloads constructor(
5163 layoutResource = layoutRes
5264 addView(this )
5365 }
66+ if (imagePlaceholderRes != - 1 ) {
67+ initPlaceHolderImage(imagePlaceholderRes)
68+ } else if (textPlaceHolder.isNotBlank()) {
69+ initPlaceholderText(textPlaceHolder)
70+ }
5471 } finally {
5572 typeArray.recycle()
5673 }
5774 setupLayoutListener()
5875 setupScrollListener()
5976 }
6077
78+ private fun initPlaceholderText (value : String ) {
79+ textView = TextView (context)
80+ textView?.apply {
81+ text = value
82+ textAlignment = View .TEXT_ALIGNMENT_CENTER
83+ addView(this )
84+ }
85+ }
86+
87+ private fun initPlaceHolderImage (resource : Int ) {
88+ imageView = ImageView (context)
89+ imageView?.apply {
90+ setImageResource(resource)
91+ addView(this )
92+ }
93+ }
94+
6195 private fun setupLayoutListener () {
6296 this .viewTreeObserver.addOnGlobalLayoutListener(object :
6397 OnGlobalLayoutListener {
6498 override fun onGlobalLayout () {
99+ setupPlaceholderLayout()
65100 getGlobalVisibleRect(componentRect)
66101 parentView = rootView.findViewById(parentResId)
67102 screenHeight = parentView.measuredHeight
@@ -70,6 +105,13 @@ class LazyLoadComponent @JvmOverloads constructor(
70105 })
71106 }
72107
108+ private fun setupPlaceholderLayout () {
109+ imageView?.layoutParams?.width = ViewGroup .LayoutParams .MATCH_PARENT
110+ imageView?.layoutParams?.height = ViewGroup .LayoutParams .WRAP_CONTENT
111+ textView?.layoutParams?.width = ViewGroup .LayoutParams .MATCH_PARENT
112+ textView?.layoutParams?.height = ViewGroup .LayoutParams .WRAP_CONTENT
113+ }
114+
73115 private fun setupScrollListener () {
74116 this .viewTreeObserver.addOnScrollChangedListener(object :
75117 ViewTreeObserver .OnScrollChangedListener {
@@ -87,9 +129,17 @@ class LazyLoadComponent @JvmOverloads constructor(
87129
88130 private fun loadComponent () {
89131 if (isInflated) return
90- layoutParams.height = LayoutParams . WRAP_CONTENT
132+ resetUI()
91133 viewStub.inflate()
92134 isInflated = true
93135 }
94136
137+ private fun resetUI () {
138+ layoutParams.height = LayoutParams .WRAP_CONTENT
139+ removeView(imageView)
140+ removeView(textView)
141+ if (! resetPaddingFlag) return
142+ setPadding(0 , 0 , 0 , 0 )
143+ }
144+
95145}
0 commit comments