Skip to content

Commit

Permalink
modify: 优化show逻辑 lastState改为对象地址 同一state不再create
Browse files Browse the repository at this point in the history
  • Loading branch information
Zhao-Yan-Yan committed Dec 21, 2021
1 parent 42728ac commit 4a2a370
Show file tree
Hide file tree
Showing 13 changed files with 181 additions and 26 deletions.
1 change: 1 addition & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
<activity android:name=".ViewPager2Activity" />
<activity android:name=".MultiFragmentActivity" />
<activity android:name=".SmartRefreshLayoutActivity" />
<activity android:name=".SmartRefreshLayoutActivity2" />
<activity android:name=".MultiStateActivity" />
<activity android:name=".MainActivity">
<intent-filter>
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/java/com/zy/demo/ApiActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@ class ApiActivity : BaseActivity<ActivityApiBinding>() {
multiState.show<LottieWaitingState>()
}

val lottieOtherState = LottieOtherState()
viewBinding.btnLottie2.setOnClickListener {
val lottieOtherState = LottieOtherState()
lottieOtherState.retry = {
Toast.makeText(this, "retry...", Toast.LENGTH_SHORT).show()
}
Expand Down
3 changes: 3 additions & 0 deletions app/src/main/java/com/zy/demo/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -44,5 +44,8 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
startActivity<SmartRefreshLayoutActivity>()
}

viewBinding.smartRefreshLayout2.setOnClickListener {
startActivity<SmartRefreshLayoutActivity2>()
}
}
}
2 changes: 0 additions & 2 deletions app/src/main/java/com/zy/demo/MultiStateFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import android.view.View
import android.view.ViewGroup
import com.zy.demo.base.BaseFragment
import com.zy.demo.base.mockError
import com.zy.demo.base.mockSuccess
import com.zy.demo.databinding.FragmentMultiStateBinding
import com.zy.multistatepage.MultiStateContainer
import com.zy.multistatepage.bindMultiState
Expand All @@ -26,7 +25,6 @@ class MultiStateFragment : BaseFragment<FragmentMultiStateBinding>() {
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
inflater.inflate(R.layout.activity_api, container, false)
val root = super.onCreateView(inflater, container, savedInstanceState)
multiState = root!!.bindMultiState()
multiState.show<LoadingState>()
Expand Down
1 change: 1 addition & 0 deletions app/src/main/java/com/zy/demo/MultiViewActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.zy.demo
import com.zy.demo.base.BaseActivity
import com.zy.demo.base.mockError
import com.zy.demo.base.mockSuccess
import com.zy.demo.base.showLoading
import com.zy.demo.databinding.ActivityMultiViewBinding
import com.zy.multistatepage.bindMultiState

Expand Down
18 changes: 9 additions & 9 deletions app/src/main/java/com/zy/demo/RefreshStateActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,18 @@ class RefreshStateActivity : BaseActivity<ActivityRefreshStateBinding>() {
private var count = 0
override fun initPage() {
val multiStateActivityRoot = bindMultiState()

lifecycleScope.launchWhenCreated {
multiStateActivityRoot.show<LoadingState>()
delay(2000)
val errorState = ErrorState().apply {
retry {
lifecycleScope.launchWhenCreated {
multiStateActivityRoot.show<LoadingState>()
delay(2000)
multiStateActivityRoot.show(this@apply) {
it.setErrorMsg("鸡你太美 ${++count}")
it.setErrorIcon(R.mipmap.jntm)
}
val errorState = ErrorState()
errorState.retry {
lifecycleScope.launchWhenCreated {
multiStateActivityRoot.show<LoadingState>()
delay(2000)
multiStateActivityRoot.show(errorState) {
it.setErrorMsg("鸡你太美 ${++count}")
it.setErrorIcon(R.mipmap.jntm)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ class SmartRefreshLayoutActivity : BaseActivity<ActivitySmartRefreshLayoutBindin
return data
}

inner class RlvAdapter : RecyclerView.Adapter<RlvAdapter.Holder>() {
class RlvAdapter : RecyclerView.Adapter<RlvAdapter.Holder>() {

var data = mutableListOf<String>()

Expand Down
74 changes: 74 additions & 0 deletions app/src/main/java/com/zy/demo/SmartRefreshLayoutActivity2.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package com.zy.demo

import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import com.zy.demo.base.*
import com.zy.demo.databinding.ActivitySmartRefreshLayout2Binding
import com.zy.demo.databinding.ActivitySmartRefreshLayoutBinding
import com.zy.multistatepage.bindMultiState
import kotlinx.coroutines.delay

/**
* @ProjectName: MultiStatePage
* @Author: jojo
* @Email: 17635289240@163.com
* @CreateDate: 2021/8/2 5:48 下午
* @Description: TODO
*/
class SmartRefreshLayoutActivity2 : BaseActivity<ActivitySmartRefreshLayout2Binding>() {
private val rlvAdapter = SmartRefreshLayoutActivity.RlvAdapter()
private val container by lazy { viewBinding.recyclerView.bindMultiState() }

override fun initPage() {
viewBinding.recyclerView.layoutManager = LinearLayoutManager(this)
viewBinding.recyclerView.adapter = rlvAdapter
loadData()


viewBinding.smartRefreshLayout.setEnableLoadMoreWhenContentNotFull(false)

viewBinding.smartRefreshLayout.setOnRefreshListener {
rlvAdapter.refreshData(getData(50))
container.showSuccess()
it.finishRefresh()
}
viewBinding.smartRefreshLayout.setOnLoadMoreListener {
rlvAdapter.addData(getData(30))
container.showSuccess()
it.finishLoadMore()
}

viewBinding.btnContent.setOnClickListener {
rlvAdapter.refreshData(getData(50))
container.showSuccess()
}
viewBinding.btnError.setOnClickListener {
rlvAdapter.clearData()
container.showError() {
it.retry { loadData() }
}
}
viewBinding.btnEmpty.setOnClickListener {
rlvAdapter.clearData()
container.showEmpty()
}
}

private fun loadData() {
lifecycleScope.launchWhenResumed {
container.showLoading()
delay(3000)
rlvAdapter.refreshData(getData(50))
container.showSuccess()
}
}

private fun getData(count: Int): MutableList<String> {
val data = mutableListOf<String>()
for (i in 0 until count) {
data.add("data")
}
return data
}
}
2 changes: 1 addition & 1 deletion app/src/main/java/com/zy/demo/base/Fun.kt
Original file line number Diff line number Diff line change
Expand Up @@ -89,4 +89,4 @@ fun MultiStateContainer.showLoading(callBack: () -> Unit = {}) {

inline fun <reified T : Activity> Activity.startActivity() {
startActivity(Intent(this, T::class.java))
}
}
6 changes: 6 additions & 0 deletions app/src/main/res/layout/activity_main.xml
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,12 @@
android:layout_height="wrap_content"
android:text="结合SmartRefreshLayout使用" />

<Button
android:id="@+id/smart_refresh_layout2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="结合SmartRefreshLayout使用2" />

<Button
android:id="@+id/btn_view_model"
android:layout_width="match_parent"
Expand Down
3 changes: 2 additions & 1 deletion app/src/main/res/layout/activity_smart_refresh_layout.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@
<com.zy.multistatepage.MultiStateContainer
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:minHeight="300dp"
android:layout_height="wrap_content">

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
Expand Down
54 changes: 54 additions & 0 deletions app/src/main/res/layout/activity_smart_refresh_layout2.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.zy.demo.SmartRefreshLayoutActivity">

<com.scwang.smart.refresh.layout.SmartRefreshLayout
android:id="@+id/smart_refresh_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constrainedHeight="true"
app:layout_constraintBottom_toTopOf="@id/ll"
app:layout_constraintTop_toTopOf="parent">

<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="wrap_content"
android:layout_height="wrap_content">

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.appcompat.widget.LinearLayoutCompat>

</com.scwang.smart.refresh.layout.SmartRefreshLayout>

<LinearLayout
android:id="@+id/ll"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintBottom_toBottomOf="parent">

<Button
android:id="@+id/btn_error"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="error" />

<Button
android:id="@+id/btn_empty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="empty" />

<Button
android:id="@+id/btn_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="content" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.FrameLayout
import android.widget.Toast
import com.zy.multistatepage.state.SuccessState

/**
Expand All @@ -24,7 +25,9 @@ class MultiStateContainer : FrameLayout {

private var originTargetView: View? = null

private var lastState: String = ""
private var lastState: MultiState? = null

var currentState: MultiState? = null

private var statePool: MutableMap<Class<out MultiState>, MultiState> = mutableMapOf()

Expand Down Expand Up @@ -63,7 +66,6 @@ class MultiStateContainer : FrameLayout {
ViewGroup.LayoutParams.MATCH_PARENT
)
addView(originTargetView, 0, layoutParams)
// MultiStatePage.config?.defaultState?.let { show(it) }
}

inline fun <reified T : MultiState> show(enableAnimator: Boolean = true, noinline notify: (T) -> Unit = {}) {
Expand All @@ -79,25 +81,35 @@ class MultiStateContainer : FrameLayout {
if (childCount == 0) {
initialization()
}
if (childCount > 1) {
removeViewAt(1)
}

if (multiState is SuccessState) {
if (childCount > 1) {
removeViewAt(1)
}
//如果上次展示的是SuccessState则跳过
if (lastState != SuccessState::class.java.name) {
if (lastState !is SuccessState) {
originTargetView?.visibility = View.VISIBLE
if (enableAnimator) originTargetView?.executeAnimator()
}
} else {
originTargetView?.visibility = View.INVISIBLE
val currentStateView = multiState.onCreateMultiStateView(context, LayoutInflater.from(context), this)
multiState.onMultiStateViewCreate(currentStateView)
addView(currentStateView)
if (enableAnimator) currentStateView.executeAnimator()
if (lastState != multiState) {
if (childCount > 1) {
removeViewAt(1)
}
val currentStateView = multiState.onCreateMultiStateView(context, LayoutInflater.from(context), this)
multiState.onMultiStateViewCreate(currentStateView)
addView(currentStateView)
if (enableAnimator) {
currentStateView.executeAnimator()
}
}
onNotifyListener?.onNotify(multiState)
}
// 当前state
currentState = multiState
//记录上次展示的state
lastState = multiState.javaClass.name
lastState = multiState
}

@JvmOverloads
Expand Down Expand Up @@ -126,4 +138,9 @@ class MultiStateContainer : FrameLayout {
}
animator.start()
}

override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
lastState = null
}
}

0 comments on commit 4a2a370

Please sign in to comment.