├── .gitignore ├── HolderView ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── kongzue │ │ └── holderview │ │ ├── HolderView.java │ │ └── callback │ │ └── OnRetryButtonClickListener.java │ └── res │ ├── drawable │ └── btn_viewholder_retry.xml │ ├── layout │ └── layout_holder_view.xml │ ├── mipmap-xxhdpi │ ├── img_empty_data.png │ ├── img_error_data.png │ └── img_error_net.png │ └── values │ ├── attr.xml │ └── strings.xml ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── kongzue │ │ └── holderviewdemo │ │ └── MainActivity.java │ └── res │ ├── drawable-v24 │ └── ic_launcher_foreground.xml │ ├── drawable │ └── ic_launcher_background.xml │ ├── layout │ └── activity_main.xml │ ├── mipmap-anydpi-v26 │ ├── ic_launcher.xml │ └── ic_launcher_round.xml │ ├── mipmap-hdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-mdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xxhdpi │ ├── ic_launcher.png │ ├── ic_launcher_round.png │ └── img_dialog_v3.png │ ├── mipmap-xxxhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ └── values │ ├── colors.xml │ ├── strings.xml │ └── styles.xml ├── build.gradle ├── gradle.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | -------------------------------------------------------------------------------- /HolderView/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /HolderView/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | apply plugin: 'com.github.dcendents.android-maven' 3 | apply plugin: 'com.jfrog.bintray' 4 | 5 | def siteUrl = 'https://github.com/kongzue/HolderView' //项目在github主页地址 6 | def gitUrl = 'https://github.com/kongzue/HolderView.git' //Git仓库的地址 7 | 8 | group = "com.kongzue.view"//发布aar前缀根节点 9 | version = "1.0.0"//发布aar的库版本 10 | android { 11 | compileSdkVersion 28 12 | 13 | 14 | defaultConfig { 15 | minSdkVersion 17 16 | targetSdkVersion 28 17 | versionCode 1 18 | versionName "1.0.0" 19 | 20 | 21 | } 22 | 23 | buildTypes { 24 | release { 25 | minifyEnabled false 26 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 27 | } 28 | } 29 | 30 | } 31 | install { 32 | repositories.mavenInstaller { 33 | // This generates POM.xml with proper parameters 34 | pom { 35 | project { 36 | packaging 'aar' 37 | name 'holderview'//添加项目描述 38 | url siteUrl 39 | licenses { 40 | license { 41 | name 'The Apache Software License, Version 2.0' 42 | url 'http://www.apache.org/licenses/LICENSE-2.0.txt' 43 | } 44 | } 45 | developers { 46 | developer { 47 | id 'myzchh'//设置自己ID 48 | name 'myzchh'//设置自己名字 49 | email 'myzcxhh@live.cn'//设置自己邮箱 50 | } 51 | } 52 | scm { 53 | connection gitUrl 54 | developerConnection gitUrl 55 | url siteUrl 56 | } 57 | } 58 | } 59 | } 60 | } 61 | task sourcesJar(type: Jar) { 62 | from android.sourceSets.main.java.srcDirs 63 | classifier = 'sources' 64 | } 65 | 66 | artifacts { 67 | archives sourcesJar 68 | } 69 | 70 | Properties properties = new Properties() 71 | properties.load(project.rootProject.file('local.properties').newDataInputStream()) 72 | bintray { 73 | user = properties.getProperty("bintray.user") 74 | key = properties.getProperty("bintray.apikey") 75 | configurations = ['archives'] 76 | pkg { 77 | repo = "maven" 78 | name = "HolderView" //项目在JCenter的名字 79 | websiteUrl = siteUrl 80 | vcsUrl = gitUrl 81 | licenses = ["Apache-2.0"] 82 | publish = true 83 | } 84 | } 85 | dependencies { 86 | implementation fileTree(dir: 'libs', include: ['*.jar']) 87 | implementation 'com.android.support:appcompat-v7:28.0.0' 88 | implementation 'com.android.support:support-v4:28.0.0' 89 | } 90 | -------------------------------------------------------------------------------- /HolderView/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /HolderView/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | -------------------------------------------------------------------------------- /HolderView/src/main/java/com/kongzue/holderview/HolderView.java: -------------------------------------------------------------------------------- 1 | package com.kongzue.holderview; 2 | 3 | import android.content.Context; 4 | import android.content.res.TypedArray; 5 | import android.graphics.drawable.Drawable; 6 | import android.util.AttributeSet; 7 | import android.view.LayoutInflater; 8 | import android.view.View; 9 | import android.view.ViewGroup; 10 | import android.widget.ImageView; 11 | import android.widget.LinearLayout; 12 | import android.widget.ProgressBar; 13 | import android.widget.RadioGroup; 14 | import android.widget.RelativeLayout; 15 | import android.widget.TextView; 16 | 17 | import com.kongzue.holderview.callback.OnRetryButtonClickListener; 18 | 19 | import java.util.ArrayList; 20 | import java.util.List; 21 | 22 | /** 23 | * @author: Kongzue 24 | * @github: https://github.com/kongzue/ 25 | * @homepage: http://kongzue.com/ 26 | * @mail: myzcxhh@live.cn 27 | * @createTime: 2019/8/2 0:48 28 | */ 29 | public class HolderView extends RelativeLayout { 30 | 31 | private Context context; 32 | 33 | private LinearLayout tipView; 34 | 35 | private List childViews; 36 | 37 | private int emptyImageResId = R.mipmap.img_empty_data; 38 | private int badNetResId = R.mipmap.img_error_net; 39 | private int errorImageResId = R.mipmap.img_error_data; 40 | 41 | private String emptyText = "暂无任何数据"; 42 | private String badNetText = "网络不稳定,请稍候重试"; 43 | private String errorText = "加载错误,请稍候重试"; 44 | 45 | private int themeColor = -1; 46 | 47 | private String retryButtonText = "点击重试"; 48 | private boolean showRetryButton = true; 49 | 50 | private OnRetryButtonClickListener onRetryButtonClickListener; 51 | 52 | public HolderView(Context context) { 53 | super(context); 54 | init(context, null); 55 | } 56 | 57 | public HolderView(Context context, AttributeSet attrs) { 58 | super(context, attrs); 59 | init(context, attrs); 60 | } 61 | 62 | public HolderView(Context context, AttributeSet attrs, int defStyleAttr) { 63 | super(context, attrs, defStyleAttr); 64 | init(context, attrs); 65 | } 66 | 67 | private void init(Context context, AttributeSet attrs) { 68 | this.context = context; 69 | 70 | tipView = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.layout_holder_view, null, false); 71 | tipView.setLayoutParams(new RadioGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); 72 | tipView.setVisibility(GONE); 73 | addView(tipView); 74 | 75 | if (attrs != null) { 76 | TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.HolderView); 77 | emptyText = getResString(typedArray, R.styleable.HolderView_emptyText, emptyText); 78 | badNetText = getResString(typedArray, R.styleable.HolderView_badNetText, badNetText); 79 | errorText = getResString(typedArray, R.styleable.HolderView_errorText, errorText); 80 | 81 | emptyImageResId = typedArray.getResourceId(R.styleable.HolderView_emptyImageResId, emptyImageResId); 82 | badNetResId = typedArray.getResourceId(R.styleable.HolderView_badNetResId, badNetResId); 83 | errorImageResId = typedArray.getResourceId(R.styleable.HolderView_errorImageResId, errorImageResId); 84 | 85 | themeColor = typedArray.getColor(R.styleable.HolderView_themeColor,themeColor); 86 | 87 | retryButtonText = getResString(typedArray, R.styleable.HolderView_retryButtonText, retryButtonText); 88 | showRetryButton = typedArray.getBoolean(R.styleable.HolderView_retryButtonVisibility, showRetryButton); 89 | typedArray.recycle(); 90 | } 91 | 92 | refreshViews(); 93 | } 94 | 95 | public void showBadNet() { 96 | setTipInfo(badNetResId, badNetText, true); 97 | } 98 | 99 | public void showWait() { 100 | showProgress(); 101 | } 102 | 103 | public void showSuccess() { 104 | showChild(true); 105 | } 106 | 107 | public void showError() { 108 | setTipInfo(errorImageResId, errorText, true); 109 | } 110 | 111 | public void showEmpty() { 112 | setTipInfo(emptyImageResId, emptyText, false); 113 | } 114 | 115 | public void showTip(int customImageResId, String text) { 116 | showTip(customImageResId, text, false); 117 | } 118 | 119 | public void showTip(int customImageResId, String text, boolean isShowRetry) { 120 | setTipInfo(customImageResId, text, isShowRetry); 121 | } 122 | 123 | private void setTipInfo(int resId, String text, boolean isShowRetry) { 124 | ImageView imgViewHolderImage = tipView.findViewById(R.id.img_viewHolder_image); 125 | TextView txtViewHolderTip = tipView.findViewById(R.id.txt_viewHolder_tip); 126 | ProgressBar psgViewHolderProgress = tipView.findViewById(R.id.psg_viewHolder_progress); 127 | TextView btnViewHolderRetry = tipView.findViewById(R.id.btn_viewHolder_retry); 128 | 129 | if (themeColor!=-1) { 130 | imgViewHolderImage.setColorFilter(themeColor); 131 | txtViewHolderTip.setTextColor(themeColor); 132 | } 133 | 134 | imgViewHolderImage.setVisibility(VISIBLE); 135 | txtViewHolderTip.setVisibility(VISIBLE); 136 | psgViewHolderProgress.setVisibility(GONE); 137 | if (isShowRetry && showRetryButton) { 138 | btnViewHolderRetry.setText(retryButtonText); 139 | btnViewHolderRetry.setVisibility(VISIBLE); 140 | } else { 141 | btnViewHolderRetry.setVisibility(GONE); 142 | } 143 | 144 | btnViewHolderRetry.setOnClickListener(new OnClickListener() { 145 | @Override 146 | public void onClick(View v) { 147 | showProgress(); 148 | if (onRetryButtonClickListener!=null){ 149 | onRetryButtonClickListener.onClick(v); 150 | } 151 | } 152 | }); 153 | 154 | imgViewHolderImage.setImageResource(resId); 155 | txtViewHolderTip.setText(text); 156 | 157 | showChild(false); 158 | } 159 | 160 | private void showProgress() { 161 | ImageView imgViewHolderImage = tipView.findViewById(R.id.img_viewHolder_image); 162 | TextView txtViewHolderTip = tipView.findViewById(R.id.txt_viewHolder_tip); 163 | ProgressBar psgViewHolderProgress = tipView.findViewById(R.id.psg_viewHolder_progress); 164 | TextView btnViewHolderRetry = tipView.findViewById(R.id.btn_viewHolder_retry); 165 | 166 | imgViewHolderImage.setVisibility(GONE); 167 | txtViewHolderTip.setVisibility(GONE); 168 | psgViewHolderProgress.setVisibility(VISIBLE); 169 | btnViewHolderRetry.setVisibility(GONE); 170 | 171 | showChild(false); 172 | } 173 | 174 | private void refreshViews() { 175 | childViews = new ArrayList<>(); 176 | for (int i = 0; i < getChildCount(); i++) { 177 | View childView = getChildAt(i); 178 | if (childView != tipView) { 179 | childViews.add(childView); 180 | } 181 | } 182 | } 183 | 184 | private void showChild(boolean isShow) { 185 | for (View child : childViews) { 186 | if (isShow) { 187 | child.setVisibility(VISIBLE); 188 | } else { 189 | child.setVisibility(GONE); 190 | } 191 | } 192 | if (isShow) { 193 | tipView.setVisibility(GONE); 194 | } else { 195 | tipView.setVisibility(VISIBLE); 196 | } 197 | } 198 | 199 | @Override 200 | public void onViewAdded(View child) { 201 | super.onViewAdded(child); 202 | refreshViews(); 203 | } 204 | 205 | private String getResString(TypedArray typedArray, int id, String defaultStr) { 206 | String cache = typedArray.getString(id); 207 | if (cache == null) { 208 | return defaultStr; 209 | } else { 210 | return cache; 211 | } 212 | } 213 | 214 | public OnRetryButtonClickListener getOnRetryButtonClickListener() { 215 | return onRetryButtonClickListener; 216 | } 217 | 218 | public HolderView setOnRetryButtonClickListener(OnRetryButtonClickListener onRetryButtonClickListener) { 219 | this.onRetryButtonClickListener = onRetryButtonClickListener; 220 | return this; 221 | } 222 | 223 | @Override 224 | public void setOnClickListener(View.OnClickListener l) { 225 | if (tipView!=null){ 226 | tipView.setOnClickListener(l); 227 | } 228 | } 229 | } 230 | -------------------------------------------------------------------------------- /HolderView/src/main/java/com/kongzue/holderview/callback/OnRetryButtonClickListener.java: -------------------------------------------------------------------------------- 1 | package com.kongzue.holderview.callback; 2 | 3 | import android.view.View; 4 | 5 | /** 6 | * @author: Kongzue 7 | * @github: https://github.com/kongzue/ 8 | * @homepage: http://kongzue.com/ 9 | * @mail: myzcxhh@live.cn 10 | * @createTime: 2019/8/2 3:02 11 | */ 12 | public interface OnRetryButtonClickListener { 13 | void onClick(View v); 14 | } 15 | -------------------------------------------------------------------------------- /HolderView/src/main/res/drawable/btn_viewholder_retry.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | -------------------------------------------------------------------------------- /HolderView/src/main/res/layout/layout_holder_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 13 | 14 | 23 | 24 | 29 | 30 | 44 | 45 | -------------------------------------------------------------------------------- /HolderView/src/main/res/mipmap-xxhdpi/img_empty_data.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kongzue/HolderView/a042b36380862e7c9b0d882767c0ca3a2f65d9fd/HolderView/src/main/res/mipmap-xxhdpi/img_empty_data.png -------------------------------------------------------------------------------- /HolderView/src/main/res/mipmap-xxhdpi/img_error_data.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kongzue/HolderView/a042b36380862e7c9b0d882767c0ca3a2f65d9fd/HolderView/src/main/res/mipmap-xxhdpi/img_error_data.png -------------------------------------------------------------------------------- /HolderView/src/main/res/mipmap-xxhdpi/img_error_net.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kongzue/HolderView/a042b36380862e7c9b0d882767c0ca3a2f65d9fd/HolderView/src/main/res/mipmap-xxhdpi/img_error_net.png -------------------------------------------------------------------------------- /HolderView/src/main/res/values/attr.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /HolderView/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | HolderView 3 | 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # HolderView 2 | 用于加载过程、加载异常、加载失败、空数据的占位布局 3 | 4 | 5 | Kongzue HolderView 6 | 7 | 8 | Maven 9 | 10 | 11 | License 12 | 13 | 14 | Homepage 15 | 16 | 17 | ![HolderView](https://github.com/kongzue/Res/raw/master/app/src/main/res/mipmap-xxxhdpi/img_holder_view.png) 18 | 19 | Demo下载: 20 | 21 | ## 引入 22 | 1) 从 Maven 仓库或 jCenter 引入: 23 | Maven仓库: 24 | ``` 25 | 26 | com.kongzue.view 27 | HolderView 28 | 1.0.0 29 | pom 30 | 31 | ``` 32 | Gradle: 33 | 在dependencies{}中添加引用: 34 | ``` 35 | implementation 'com.kongzue.view:HolderView:1.0.0' 36 | ``` 37 | 38 | ## 使用方法 39 | HolderView 类似于 RelativeLayout,你只需要将自己的布局放入其中即可: 40 | ``` 41 | 45 | 46 | 47 | 48 | 49 | ``` 50 | 51 | HolderView 提供加载过程、加载异常、加载失败、空数据的占位布局,使用以下方法即可调用: 52 | ``` 53 | //显示正在加载样式 54 | holdView.showWait(); 55 | 56 | //显示网络异常提示 57 | holdView.showBadNet(); 58 | 59 | //显示数据加载错误提示 60 | holdView.showError(); 61 | 62 | //显示空数据提示 63 | holdView.showEmpty(); 64 | 65 | //显示完成(即关闭所有提示,显示你的布局) 66 | holdView.showSuccess(); 67 | ``` 68 | 69 | ## 自定义 70 | 在 XML 布局中自定义 HolderView: 71 | ``` 72 | 85 | 86 | 87 | 88 | 89 | ``` 90 | 91 | 属性对应说明: 92 | 93 | 字段 | 含义 | 类型 94 | ---|---|--- 95 | app:badNetResId | 网络错误时图片资源 | ResInt 96 | app:badNetText | 网络错误时提示文字 | String 97 | app:emptyImageResId | 空数据时图片资源 | ResInt 98 | app:emptyText | 空数据时提示文字 | String 99 | app:errorImageResId | 加载错误时图片资源 | ResInt 100 | app:errorText | 加载错误时提示文字 | String 101 | app:retryButtonText | 重试按钮文本 | String 102 | app:retryButtonVisibility | 是否显示重试按钮 | boolean 103 | app:themeColor | 主体颜色 | ColorInt 104 | 105 | 临时显示自己的提示: 106 | ``` 107 | holdView.showTip(R.mipmap.img_empty_data, "提示文字"); 108 | ``` 109 | 110 | ## 开源协议 111 | ``` 112 | Copyright Kongzue HolderView 113 | 114 | Licensed under the Apache License, Version 2.0 (the "License"); 115 | you may not use this file except in compliance with the License. 116 | You may obtain a copy of the License at 117 | 118 | http://www.apache.org/licenses/LICENSE-2.0 119 | 120 | Unless required by applicable law or agreed to in writing, software 121 | distributed under the License is distributed on an "AS IS" BASIS, 122 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 123 | See the License for the specific language governing permissions and 124 | limitations under the License. 125 | ``` 126 | 127 | ## 更新日志 128 | v1.0.0: 129 | - 全新发布; -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 28 5 | defaultConfig { 6 | applicationId "com.kongzue.holderviewdemo" 7 | minSdkVersion 17 8 | targetSdkVersion 28 9 | versionCode 1 10 | versionName "1.0" 11 | } 12 | buildTypes { 13 | release { 14 | minifyEnabled false 15 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 16 | } 17 | } 18 | } 19 | 20 | dependencies { 21 | implementation fileTree(dir: 'libs', include: ['*.jar']) 22 | implementation 'com.android.support:appcompat-v7:28.0.0' 23 | implementation 'com.android.support:support-v4:28.0.0' 24 | implementation project(path: ':HolderView') 25 | } 26 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/kongzue/holderviewdemo/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.kongzue.holderviewdemo; 2 | 3 | import android.os.Bundle; 4 | import android.support.v7.app.AppCompatActivity; 5 | import android.view.View; 6 | import android.widget.Button; 7 | 8 | import com.kongzue.holderview.HolderView; 9 | 10 | public class MainActivity extends AppCompatActivity { 11 | 12 | private Button btnLoading; 13 | private Button btnBadNet; 14 | private Button btnErrorData; 15 | private Button btnEmptyData; 16 | private Button btnSuccess; 17 | private HolderView holdView; 18 | 19 | @Override 20 | protected void onCreate(Bundle savedInstanceState) { 21 | super.onCreate(savedInstanceState); 22 | setContentView(R.layout.activity_main); 23 | 24 | btnLoading = findViewById(R.id.btn_loading); 25 | btnBadNet = findViewById(R.id.btn_badNet); 26 | btnErrorData = findViewById(R.id.btn_errorData); 27 | btnEmptyData = findViewById(R.id.btn_emptyData); 28 | btnSuccess = findViewById(R.id.btn_success); 29 | holdView = findViewById(R.id.holdView); 30 | 31 | holdView.showWait(); 32 | 33 | btnLoading.setOnClickListener(new View.OnClickListener() { 34 | @Override 35 | public void onClick(View v) { 36 | holdView.showWait(); 37 | } 38 | }); 39 | 40 | btnBadNet.setOnClickListener(new View.OnClickListener() { 41 | @Override 42 | public void onClick(View v) { 43 | holdView.showBadNet(); 44 | } 45 | }); 46 | 47 | btnErrorData.setOnClickListener(new View.OnClickListener() { 48 | @Override 49 | public void onClick(View v) { 50 | holdView.showError(); 51 | } 52 | }); 53 | 54 | btnEmptyData.setOnClickListener(new View.OnClickListener() { 55 | @Override 56 | public void onClick(View v) { 57 | holdView.showEmpty(); 58 | } 59 | }); 60 | 61 | btnSuccess.setOnClickListener(new View.OnClickListener() { 62 | @Override 63 | public void onClick(View v) { 64 | holdView.showSuccess(); 65 | } 66 | }); 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | 13 | 19 | 22 | 25 | 26 | 27 | 28 | 34 | 35 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 14 | 15 |