# Gloading
**Repository Path**: luckybilly/Gloading
## Basic Information
- **Project Name**: Gloading
- **Description**: 用Adapter模式深度解耦Android App中全局加载中、加载失败及空数据视图。按照这个思路你也可以在项目中解决其它耦合问题
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: https://github.com/luckybilly/Gloading
- **GVP Project**: No
## Statistics
- **Stars**: 34
- **Forks**: 6
- **Created**: 2019-03-24
- **Last Updated**: 2024-07-02
## Categories & Tags
**Categories**: android-modules
**Tags**: None
## README
# Gloading
[中文文档](README-zh-CN.md)
Show global loading status view in a low coupling way for Android App.
[JavaDocs](https://luckybilly.github.io/Gloading/) | [Download Demo](https://github.com/luckybilly/Gloading/raw/master/demo.apk)
Latest Version: [](https://bintray.com/hellobilly/android/gloading/_latestVersion)
Lightweight: aar is less than 6KB, just 170 code lines and 104 comment lines within only 1 java file.
Design as Adapter pattern,with good compatibility: most third-party LoadingViews can be used as Gloading views in the Adapter
## Demo
Wrap activity page
Load success|Load failed and click retry|Load success with empty data|This loading status UI is special
:---:|:---:|:---:|:---:
|
|
|
Wrap view(s)
Wrap single view|Wrap views|Wrap in GridView|Wrap in RecyclerView
No words below
:---:|:---:|:---:|:---:
|
|
|
## Usage
```groovy
compile 'com.billy.android:gloading:1.0.0'
```
#### 1. Provide global loading status views
For global usage, create an Adapter to provide views for all status via getView(...) method
Note: Activity/Fragment/View reused in 2 or more apps with different loading status views?
~~~
Just provide a different Adapter for each app.
No need to change any usage code
~~~
demo
```java
public class GlobalAdapter implements Gloading.Adapter {
@Override
public View getView(Gloading.Holder holder, View convertView, int status) {
GlobalLoadingStatusView loadingStatusView = null;
//reuse the old view, if possible
if (convertView != null && convertView instanceof GlobalLoadingStatusView) {
loadingStatusView = (GlobalLoadingStatusView) convertView;
}
if (loadingStatusView == null) {
loadingStatusView = new GlobalLoadingStatusView(holder.getContext(), holder.getRetryTask());
}
loadingStatusView.setStatus(status);
return loadingStatusView;
}
class GlobalLoadingStatusView extends RelativeLayout {
public GlobalLoadingStatusView(Context context, Runnable retryTask) {
super(context);
//init view ...
}
public void setStatus(int status) {
//change ui by different status...
}
}
}
```
See [demo code](app/src/main/java/com/billy/android/loadingstatusview/wrapactivity/adapter/GlobalAdapter.java)
#### 2. Init Gloading by Adapter before use it
```java
Gloading.initDefault(new GlobalAdapter());
```
Note: Use [AutoRegister](https://github.com/luckybilly/AutoRegister) to decoupling this step.
#### 3. Show global loading status views in all pages
3.1 Wrap something and return a Gloading.Holder object
```java
//Gloading wrapped whole activity, wrapper view: android.R.id.content
Gloading.Holder holder = Gloading.getDefault().wrap(activity);
//with load failed retry task
Gloading.Holder holder = Gloading.getDefault().wrap(activity).withRetry(retryTask);
```
or
```java
//Gloading will create a FrameLayout to wrap it
Gloading.Holder holder = Gloading.getDefault().wrap(view);
//with load failed retry task
Gloading.Holder holder = Gloading.getDefault().wrap(view).withRetry(retryTask);
```
3.2 Show status views for loading/loadFailed/empty/... by Gloading.Holder
```java
//show loading status view by holder
holder.showLoading()
//show load success status view by holder (frequently, hide gloading)
holder.showLoadSuccess()
//show load failed status view by holder (frequently, needs retry task)
holder.showFailed()
//show empty status view by holder. (load completed, but data is empty)
holder.showEmpty()
```
More [Gloading.Holder APIs](https://luckybilly.github.io/Gloading/com/billy/android/loading/Gloading.Holder.html)
## Practice
### 1. Wrap into BaseActivity/BaseFragment
```java
public abstract class BaseActivity extends Activity {
protected Gloading.Holder mHolder;
/**
* make a Gloading.Holder wrap with current activity by default
* override this method in subclass to do special initialization
*/
protected void initLoadingStatusViewIfNeed() {
if (mHolder == null) {
//bind status view to activity root view by default
mHolder = Gloading.getDefault().wrap(this).withRetry(new Runnable() {
@Override
public void run() {
onLoadRetry();
}
});
}
}
protected void onLoadRetry() {
// override this method in subclass to do retry task
}
public void showLoading() {
initLoadingStatusViewIfNeed();
mHolder.showLoading();
}
public void showLoadSuccess() {
initLoadingStatusViewIfNeed();
mHolder.showLoadSuccess();
}
public void showLoadFailed() {
initLoadingStatusViewIfNeed();
mHolder.showLoadFailed();
}
public void showEmpty() {
initLoadingStatusViewIfNeed();
mHolder.showEmpty();
}
}
```
### 2. Call super methods inside subclasses
```java
public class GlobalFailedActivity extends BaseActivity {
private ImageView imageView;
private String picUrl;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//do sth init...
loadData();
}
private void loadData() {
showLoading();
loadDataAndCallback(new Callback() {
public void success(Data data) {
if (isEmpty(data)) {
showEmpty();
} else {
//do sth with data...
showLoadSuccess();
}
}
public void failed() {
//do sth...
showLoadFailed();
}
});
}
@Override
protected void onLoadRetry() {
loadData();
}
//other codes...
}
```
## Debug mode
```java
//debug mode. if set true, logs will print into logcat
Gloading.debug(trueOrFalse);
```
## Thanks
Pictures in demo app all from: https://www.thiswaifudoesnotexist.net/
Global LoadingView pictures used in demo all from: https://www.iconfont.cn/
Special LoadingView UI used in demo from: https://github.com/ldoublem/LoadingView/