一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Android - Android通用LoadingView加載框架詳解

Android通用LoadingView加載框架詳解

2022-03-10 15:09qq_14876133 Android

這篇文章主要為大家詳細(xì)介紹了Android通用LoadingView加載框架的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

手寫一個(gè)通用加載中、顯示數(shù)據(jù)、加載失敗、空數(shù)據(jù)的LoadingView框架。

Android通用LoadingView加載框架詳解

定義3個(gè)布局:加載中,加載失敗,空數(shù)據(jù)

加載中:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:background="#ffffff"
 android:clickable="true">
 
 <ProgressBar
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_gravity="center"
  android:indeterminate="true" />
 
</FrameLayout>

加載失敗:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:background="#ffffff"
 android:clickable="true"
 android:orientation="vertical">
 
 <ImageView
  android:id="@+id/error_retry"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_gravity="center"
  android:gravity="center"
  android:src="@drawable/loading_retry" />
 
</FrameLayout>

空數(shù)據(jù):

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:background="#ffffff"
 android:clickable="true"
 android:orientation="vertical">
 
 <ImageView
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_gravity="center"
  android:src="@drawable/loading_empty" />
 
</FrameLayout>

自定義一個(gè)LoadingView:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
package com.sample.loadingview.widget;
 
import android.content.Context;
import android.content.res.TypedArray;
import android.support.annotation.AttrRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
 
import com.sample.loadingview.R;
 
 
public class LoadingView extends FrameLayout {
 private int emptyLayoutId, errorLayoutId, loadingLayoutId;
 private View contentView, emptyView, errorView, loadingView;
 private LayoutInflater mInflater;
 private SparseArray<View> views = new SparseArray<>();
 
 public LoadingView(@NonNull Context context) {
  this(context, null);
 }
 
 public LoadingView(@NonNull Context context, @Nullable AttributeSet attrs) {
  this(context, attrs, 0);
 }
 
 public LoadingView(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) {
  super(context, attrs, defStyleAttr);
 
  TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.LoadLayout);
  emptyLayoutId = a.getResourceId(R.styleable.LoadLayout_emptyView, R.layout.loading_empty);
  errorLayoutId = a.getResourceId(R.styleable.LoadLayout_errorView, R.layout.loading_error);
  loadingLayoutId = a.getResourceId(R.styleable.LoadLayout_loadingView, R.layout.loading_load);
  mInflater = LayoutInflater.from(getContext());
  a.recycle();
  loadingView = mInflater.inflate(loadingLayoutId, null);
 }
 
 @Override
 protected void onFinishInflate() {
  super.onFinishInflate();
  if (getChildCount() < 1) {
   throw new RuntimeException("content view can not be null");
  }
  contentView = getChildAt(0);
 
  if (loadingView.getVisibility() != GONE)
   loadingView.setVisibility(GONE);
  addView(loadingView);
  views.put(loadingLayoutId, loadingView);
 }
 
 public void showError() {
  errorView = views.get(errorLayoutId);
  if (errorView == null) {
   errorView = mInflater.inflate(errorLayoutId, null);
   addView(errorView);
   views.put(errorLayoutId, errorView);
   final ImageView errorRetry = (ImageView) errorView.findViewById(R.id.error_retry);
   errorRetry.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
     if (mOnRetryClickListener != null)
      mOnRetryClickListener.onClick(errorRetry);
    }
   });
  }
  if (errorView.getVisibility() != VISIBLE)
   errorView.setVisibility(VISIBLE);
 
  for (int i = 0, len = views.size(); i < len; i++) {
   int key = views.keyAt(i);
   if (key != errorLayoutId) {
    View view = views.valueAt(i);
    if (view != null)
     if (view.getVisibility() != GONE)
      view.setVisibility(GONE);
   }
  }
 }
 
 public void showEmpty() {
  emptyView = views.get(emptyLayoutId);
  if (emptyView == null) {
   emptyView = mInflater.inflate(emptyLayoutId, null);
   addView(emptyView);
   views.put(emptyLayoutId, emptyView);
  }
  if (emptyView.getVisibility() != VISIBLE)
   emptyView.setVisibility(VISIBLE);
 
  for (int i = 0, len = views.size(); i < len; i++) {
   int key = views.keyAt(i);
   if (key != emptyLayoutId) {
    View view = views.valueAt(i);
    if (view != null)
     if (view.getVisibility() != GONE)
      view.setVisibility(GONE);
   }
  }
 }
 
 public void showLoading() {
  loadingView = views.get(loadingLayoutId);
  if (loadingView.getVisibility() != VISIBLE)
   loadingView.setVisibility(VISIBLE);
 
  for (int i = 0, len = views.size(); i < len; i++) {
   int key = views.keyAt(i);
   if (key != loadingLayoutId) {
    View view = views.valueAt(i);
    if (view != null)
     if (view.getVisibility() != GONE)
      view.setVisibility(GONE);
   }
  }
 }
 
 public void showContent() {
  for (int i = 0, len = views.size(); i < len; i++) {
   View view = views.valueAt(i);
   if (view != null)
    if (view.getVisibility() != GONE)
     view.setVisibility(GONE);
  }
 }
 
 private OnClickListener mOnRetryClickListener;
 
 public void setOnRetryClickListener(OnClickListener onRetryClickListener) {
  this.mOnRetryClickListener = onRetryClickListener;
 }
}

定義attrs.xml

?
1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
<resources>
 <declare-styleable name="LoadLayout">
  <attr name="loadingView" format="reference" />
  <attr name="errorView" format="reference" />
  <attr name="retryView" format="reference" />
  <attr name="emptyView" format="reference" />
 </declare-styleable>
</resources>

以上就這么些代碼,接下來我們測(cè)試一下

Activity

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package com.sample.loadingview;
 
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
 
import com.sample.loadingview.widget.LoadingView;
 
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
 
 private LoadingView loading_view;
 private Button btn_loading;
 private Button btn_content;
 private Button btn_error;
 private Button btn_empty;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
 
  loading_view = (LoadingView) findViewById(R.id.loading_view);
  btn_loading = (Button) findViewById(R.id.btn_loading);
  btn_content = (Button) findViewById(R.id.btn_content);
  btn_error = (Button) findViewById(R.id.btn_error);
  btn_empty = (Button) findViewById(R.id.btn_empty);
 
  //設(shè)置加載錯(cuò)誤的點(diǎn)擊事件
  loading_view.setOnRetryClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
    Toast.makeText(MainActivity.this, "重新加載", Toast.LENGTH_SHORT).show();
    loading_view.showLoading();
   }
  });
  btn_loading.setOnClickListener(this);
  btn_content.setOnClickListener(this);
  btn_error.setOnClickListener(this);
  btn_empty.setOnClickListener(this);
 }
 
 @Override
 public void onClick(View v) {
  switch (v.getId()) {
   case R.id.btn_loading:
    loading_view.showLoading();//顯示加載界面
    break;
   case R.id.btn_content:
    loading_view.showContent();//顯示內(nèi)容界面
    break;
   case R.id.btn_error:
    loading_view.showError();//顯示錯(cuò)誤界面
    break;
   case R.id.btn_empty:
    loading_view.showEmpty();//顯示空數(shù)據(jù)界面
    break;
  }
 }
}

 源碼:下載地址

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:https://blog.csdn.net/qq_14876133/article/details/80924356

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 九九热这里只有精品视频免费 | 亚洲午夜久久久久国产 | 日日舔| 国产精品国产三级国产专区不 | 深夜福利影院在线观看 | 被高跟鞋调教丨vk | 本土自拍 | 男女肉粗暴进来下面好紧 | 潘甜甜在线观看 | 操美女| 色老女人| 好湿好滑好硬好爽好深视频 | 韩国丽卡三级作品 | 狠狠的撞进去嗯啊h女强男视频 | 四虎影视永久在线观看 | 亚洲高清在线视频 | 喜欢老头吃我奶躁我的动图 | 国产精品免费精品自在线观看 | 成年视频在线播放 | 高清女主播一区二区三区 | 成人深夜视频 | 久久久精品3d动漫一区二区三区 | gangbang日本| 天天操天天射天天色 | 国产综合久久 | 国产精品自在欧美一区 | 欧美二区三区 | 亚洲精品高清中文字幕完整版 | 欧美精品一区二区在线观看 | 午夜AV内射一区二区三区红桃视 | 99久久精品6在线播放 | 国产精品久久久久久 | 我的妹妹最近有点怪免费播放 | 亚洲国产情侣一区二区三区 | 成年男女免费大片在线观看 | 国产精品久久久99 | 国产 日韩 一区 | 日韩美女强理论片 | 日韩欧美中文字幕一区二区三区 | 99国产高清久久久久久网站 | 从后面撕开老师的丝袜动态图 |