diff --git a/README-en.md b/README-en.md index 8768c4a..f2662b2 100644 --- a/README-en.md +++ b/README-en.md @@ -16,7 +16,7 @@ add the dependency to your build.gradle: ```groovy // andoridx, kotlin version, recommend - implementation 'com.github.nukc.stateview:kotlin:2.1' + implementation 'com.github.nukc.stateview:kotlin:2.1.1' // support library, java version compile 'com.github.nukc.stateview:library:1.5.4' diff --git a/README.md b/README.md index 72817de..b52abda 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ StateView 一个轻量级的控件, 继承自 `View`, 吸收了 `ViewStub` 的 ```groovy // andoridx, kotlin version, recommend - implementation 'com.github.nukc.stateview:kotlin:2.1' + implementation 'com.github.nukc.stateview:kotlin:2.1.1' // support library, java version compile 'com.github.nukc.stateview:library:1.5.4' diff --git a/app/src/main/java/com/github/nukc/sample/BaseActivity.java b/app/src/main/java/com/github/nukc/sample/BaseActivity.java index 5d1ea53..1067120 100644 --- a/app/src/main/java/com/github/nukc/sample/BaseActivity.java +++ b/app/src/main/java/com/github/nukc/sample/BaseActivity.java @@ -5,6 +5,7 @@ import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; +import android.widget.Toast; import androidx.annotation.LayoutRes; import androidx.annotation.Nullable; @@ -17,56 +18,58 @@ * @author Nukc. */ -public abstract class BaseActivity extends AppCompatActivity{ +public abstract class BaseActivity extends AppCompatActivity { - private StateView mStateView; + private StateView mStateView; - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(setContentView()); - mStateView = StateView.inject(injectTarget()); + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(setContentView()); + mStateView = StateView.inject(injectTarget()); - mStateView.setOnRetryClickListener(new StateView.OnRetryClickListener() { - @Override - public void onRetryClick() { - //do something - } - }); - } + mStateView.setOnRetryClickListener(new StateView.OnRetryClickListener() { + @Override + public void onRetryClick() { + //do something + Toast.makeText(BaseActivity.this, "onRetryClick", Toast.LENGTH_SHORT).show(); + } + }); + } - protected abstract @LayoutRes int setContentView(); + protected abstract @LayoutRes + int setContentView(); - protected abstract View injectTarget(); + protected abstract View injectTarget(); - protected void setAnimator(AnimatorProvider animator) { - if (mStateView != null) { - mStateView.setAnimatorProvider(animator); - } - } + protected void setAnimator(AnimatorProvider animator) { + if (mStateView != null) { + mStateView.setAnimatorProvider(animator); + } + } - @Override - public boolean onCreateOptionsMenu(Menu menu) { - new MenuInflater(this).inflate(R.menu.menu_inject, menu); - return super.onCreateOptionsMenu(menu); - } + @Override + public boolean onCreateOptionsMenu(Menu menu) { + new MenuInflater(this).inflate(R.menu.menu_inject, menu); + return super.onCreateOptionsMenu(menu); + } - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case R.id.show_empty: - mStateView.showEmpty(); - break; - case R.id.show_retry: - mStateView.showRetry(); - break; - case R.id.show_loading: - mStateView.showLoading(); - break; - case R.id.show_content: - mStateView.showContent(); - break; - } - return super.onOptionsItemSelected(item); - } + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.show_empty: + mStateView.showEmpty(); + break; + case R.id.show_retry: + mStateView.showRetry(); + break; + case R.id.show_loading: + mStateView.showLoading(); + break; + case R.id.show_content: + mStateView.showContent(); + break; + } + return super.onOptionsItemSelected(item); + } } diff --git a/app/src/main/java/com/github/nukc/sample/SetViewActivity.java b/app/src/main/java/com/github/nukc/sample/SetViewActivity.java index 3e56c7d..4d46a55 100644 --- a/app/src/main/java/com/github/nukc/sample/SetViewActivity.java +++ b/app/src/main/java/com/github/nukc/sample/SetViewActivity.java @@ -6,6 +6,7 @@ import android.view.MenuItem; import android.view.View; import android.widget.TextView; +import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; @@ -14,53 +15,58 @@ public class SetViewActivity extends AppCompatActivity { - private StateView mStateView; + private StateView mStateView; - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_inject); + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_inject); - mStateView = StateView.inject(this); - mStateView.setAnimatorProvider(new SlideAnimatorProvider()); - mStateView.setOnRetryClickListener(new StateView.OnRetryClickListener() { - @Override - public void onRetryClick() { - //do something - mStateView.showRetry(); - } - }); + mStateView = StateView.inject(this); + mStateView.setAnimatorProvider(new SlideAnimatorProvider()); + mStateView.setOnRetryClickListener(new StateView.OnRetryClickListener() { + @Override + public void onRetryClick() { + //do something + mStateView.showContent(); + Toast.makeText(SetViewActivity.this, "onRetryClick", Toast.LENGTH_SHORT).show(); + } + }); - View emptyView = View.inflate(this, R.layout.view_empty, null); - TextView tvMessage = emptyView.findViewById(R.id.tv_message); - if (tvMessage != null) { - tvMessage.setText("Run setEmptyView"); - } - mStateView.setEmptyView(emptyView); - } + View emptyView = View.inflate(this, R.layout.view_empty, null); + TextView tvMessage = emptyView.findViewById(R.id.tv_message); + if (tvMessage != null) { + tvMessage.setText("Run setEmptyView"); + } + mStateView.setEmptyView(emptyView); - @Override - public boolean onCreateOptionsMenu(Menu menu) { - new MenuInflater(this).inflate(R.menu.menu_inject, menu); - return super.onCreateOptionsMenu(menu); - } +// View retryView = View.inflate(this, R.layout.view_retry31, null); +// mStateView.setRetryView(retryView); + mStateView.setRetryResource(R.layout.view_retry31); + } - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case R.id.show_empty: - mStateView.showEmpty(); - break; - case R.id.show_retry: - mStateView.showRetry(); - break; - case R.id.show_loading: - mStateView.showLoading(); - break; - case R.id.show_content: - mStateView.showContent(); - break; - } - return super.onOptionsItemSelected(item); - } + @Override + public boolean onCreateOptionsMenu(Menu menu) { + new MenuInflater(this).inflate(R.menu.menu_inject, menu); + return super.onCreateOptionsMenu(menu); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.show_empty: + mStateView.showEmpty(); + break; + case R.id.show_retry: + mStateView.showRetry(); + break; + case R.id.show_loading: + mStateView.showLoading(); + break; + case R.id.show_content: + mStateView.showContent(); + break; + } + return super.onOptionsItemSelected(item); + } } diff --git a/app/src/main/res/layout/view_retry31.xml b/app/src/main/res/layout/view_retry31.xml new file mode 100644 index 0000000..5c248eb --- /dev/null +++ b/app/src/main/res/layout/view_retry31.xml @@ -0,0 +1,7 @@ + + + \ No newline at end of file diff --git a/bintray.gradle b/bintray.gradle index 6fbaef4..b30a945 100644 --- a/bintray.gradle +++ b/bintray.gradle @@ -5,7 +5,7 @@ def siteUrl = 'https://github.com/nukc/StateView' // 项目的主页 def gitUrl = 'https://github.com/nukc/StateView.git' // Git仓库的url group = "com.github.nukc.stateview" -version = "2.1" +version = "2.1.1" install { repositories.mavenInstaller { diff --git a/kotlin/build.gradle b/kotlin/build.gradle index 68ac615..9a2d9e1 100644 --- a/kotlin/build.gradle +++ b/kotlin/build.gradle @@ -9,8 +9,8 @@ android { defaultConfig { minSdkVersion 15 targetSdkVersion 29 - versionCode 4 - versionName "2.1" + versionCode 5 + versionName "2.1.1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles 'consumer-rules.pro' diff --git a/kotlin/src/main/AndroidManifest.xml b/kotlin/src/main/AndroidManifest.xml index 57a569f..4df15cd 100644 --- a/kotlin/src/main/AndroidManifest.xml +++ b/kotlin/src/main/AndroidManifest.xml @@ -1,2 +1 @@ - + diff --git a/kotlin/src/main/java/com/github/nukc/stateview/StateView.kt b/kotlin/src/main/java/com/github/nukc/stateview/StateView.kt index d38da25..48211cc 100644 --- a/kotlin/src/main/java/com/github/nukc/stateview/StateView.kt +++ b/kotlin/src/main/java/com/github/nukc/stateview/StateView.kt @@ -14,6 +14,7 @@ import android.view.ViewGroup import android.widget.* import androidx.annotation.IntDef import androidx.annotation.LayoutRes +import androidx.collection.ArraySet import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.view.NestedScrollingChild import androidx.core.view.NestedScrollingParent @@ -42,6 +43,7 @@ class StateView : View { set(value) { setView(RETRY, value) field = value + setupRetryClickListener() } var loadingView: View? = null set(value) { @@ -49,6 +51,8 @@ class StateView : View { field = value } + private val addSet = ArraySet<@ViewType Int>() + var inflater: LayoutInflater? = null var onRetryClickListener: OnRetryClickListener? = null var onInflateListener: OnInflateListener? = null @@ -116,44 +120,43 @@ class StateView : View { visibility = GONE } - fun showEmpty(): View { - if (emptyView == null) { - emptyView = inflate(emptyResource, EMPTY) - } - showView(emptyView!!) - return emptyView!! - } + fun showEmpty() = showView(EMPTY) - fun showRetry(): View { - if (retryView == null) { - retryView = inflate(retryResource, RETRY) - retryView!!.setOnClickListener { - if (onRetryClickListener != null) { - showLoading() - retryView!!.postDelayed({ - onRetryClickListener?.onRetryClick() - }, 400) - } - } - } - showView(retryView!!) - return retryView!! - } + fun showRetry() = showView(RETRY) - fun showLoading(): View { - if (loadingView == null) { - loadingView = inflate(loadingResource, LOADING) - } - showView(loadingView!!) - return loadingView!! - } + fun showLoading() = showView(LOADING) /** * show the state view */ - private fun showView(view: View) { + private fun showView(@ViewType viewType: Int): View { + var view = when (viewType) { + EMPTY -> emptyView + RETRY -> retryView + LOADING -> loadingView + else -> throw IllegalArgumentException("Invalid viewType: $viewType") + } + // if the view is null, inflate layoutResource + if (view == null) { + val layoutResource = when (viewType) { + EMPTY -> emptyResource + RETRY -> retryResource + LOADING -> loadingResource + else -> NO_ID + } + view = inflate(layoutResource, viewType) + when (viewType) { + EMPTY -> emptyView = view + RETRY -> retryView = view + LOADING -> loadingView = view + } + } else if (addSet.contains(viewType)) { + // if the view not in the parent + addToParent(viewType, parent as ViewGroup, view) + } setVisibility(view, VISIBLE) hideViews(view) + return view } /** @@ -217,7 +220,7 @@ class StateView : View { } /** - * set [view] add to [getParent] + * set [view], add to [getParent] when [showView] */ private fun setView(@ViewType viewType: Int, view: View?) { val viewParent = parent @@ -235,13 +238,13 @@ class StateView : View { viewParent.removeViewInLayout(it) } - view?.let { addToParent(viewType, viewParent, view) } + addSet.add(viewType) } } private fun inflate(@LayoutRes layoutResource: Int, @ViewType viewType: Int): View { val viewParent = parent - return if (viewParent != null && viewParent is ViewGroup) { + return if (viewParent is ViewGroup) { if (layoutResource != 0) { val factory: LayoutInflater = inflater ?: LayoutInflater.from(context) val view = factory.inflate(layoutResource, viewParent, false) @@ -255,6 +258,8 @@ class StateView : View { } private fun addToParent(@ViewType viewType: Int, viewParent: ViewGroup, view: View): View { + addSet.remove(viewType) + val index = viewParent.indexOfChild(this) // 防止还能触摸底下的 View view.isClickable = true @@ -294,6 +299,17 @@ class StateView : View { return view } + private fun setupRetryClickListener() { + retryView?.setOnClickListener { + if (onRetryClickListener != null) { + showLoading() + retryView!!.postDelayed({ + onRetryClickListener?.onRetryClick() + }, 400) + } + } + } + /** * Listener used to receive a notification after the RetryView is clicked. *