激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Android - Android通用LoadingView加載框架詳解

Android通用LoadingView加載框架詳解

2022-03-10 15:09qq_14876133 Android

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

手寫一個通用加載中、顯示數據、加載失敗、空數據的LoadingView框架。

Android通用LoadingView加載框架詳解

定義3個布局:加載中,加載失敗,空數據

加載中:

?
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>

空數據:

?
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>

自定義一個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>

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

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);
 
  //設置加載錯誤的點擊事件
  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();//顯示內容界面
    break;
   case R.id.btn_error:
    loading_view.showError();//顯示錯誤界面
    break;
   case R.id.btn_empty:
    loading_view.showEmpty();//顯示空數據界面
    break;
  }
 }
}

 源碼:下載地址

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久人人av | 一级电影免费在线观看 | 久精品久久| 日本欧美一区二区三区在线播 | 国产亚洲精品久久久久久久软件 | 日韩av在线影院 | 性色av一区二区三区在线观看 | 欧美三级欧美成人高清www | 成人免费在线观看视频 | 国产精品久久久久久久久久东京 | 少妇淫片免费一级毛片 | 国产精品一区2区3区 | 欧美日韩亚洲不卡 | h视频在线免费观看 | 免费看黄色一级片 | 永久免费黄色大片 | 成人国产精品齐天大性 | 久久区二区 | 13一14毛片免费看 | 黄色片网站免费观看 | 老师你怎么会在这第2季出现 | 黄色网址免费在线播放 | 久久精品国产亚洲7777小说 | 在线看毛片的网站 | 久草在线看片 | 欧美在线观看视频一区 | 成人不卡免费视频 | 欧美一级爱操视频 | 欧美第1页| 一区视频 | 黄色片在线观看网站 | 欧美亚洲综合在线 | 暖暖免费观看高清完整版电影 | 国产69精品久久久久9999不卡免费 | 香蕉成人在线视频 | 久久久一区二区精品 | 91精品最新国内在线播放 | 一级在线| 精品一区二区三区在线视频 | 在线观看免费污视频 | 亚洲精品午夜视频 |