国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看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一区二区三区 | 中文字幕第18页 | 成人久久精品 | 欧美日韩在线电影 | 一区二区三区免费看 | 亚洲精品视频一区二区三区 | 亚洲国产精品一区 | 国产成人a亚洲精品 | 午夜在线观看影院 | 久草电影在线 | 成人网18免费网站 | 亚洲喷水 | 国产免费自拍 | a级毛片免费高清视频 | 免费一级毛片 | 午夜私人影院在线观看 | 精品国产乱码久久久久久蜜柚 | 色婷婷国产精品免费网站 | 国产精品一区二区三区四区 | 精品欧美一区二区三区久久久 | 亚洲免费在线视频 | 精品一区二区在线观看 |