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.
*