3
Android 加载成功、加载失败、加载中、无数据四个不同界面的切换
source link: http://www.androidchina.net/8381.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
Android 加载成功、加载失败、加载中、无数据四个不同界面的切换 – Android开发中文站
自定义一个Framelayout来切换布局。
1.首先自定义一个Framelayout,用addview()把加载失败、加载中、无数据添加到Framelayout;因为加载成功的view是随时变化的,所以提供bindSuccessView()方法添加。
import
android.content.Context;
import
android.util.AttributeSet;
import
android.view.View;
import
android.widget.Button;
import
android.widget.FrameLayout;
import
com.ouyang.qqui.R;
public
class
StateLayout
extends
FrameLayout{
private
View loadingView;
private
View errorView;
private
View successView;
private
View emptyView;
public
StateLayout(Context context) {
this
(context,
null
);
}
public
StateLayout(Context context, AttributeSet attrs) {
this
(context, attrs,
0
);
}
public
StateLayout(Context context, AttributeSet attrs,
int
defStyleAttr) {
super
(context, attrs, defStyleAttr);
initView();
//初始化View
}
/**
* 添加那4个子View:加载中的,加载成功的,加载没有数据,加载失败的
*/
private
void
initView() {
//1.加载loadingView
loadingView = View.inflate(getContext(), R.layout.progressbar_layout,
null
);
addView(loadingView);
//2.添加失败的View
errorView = View.inflate(getContext(), R.layout.network404_layout,
null
);
Button btn_reload = (Button) errorView.findViewById(R.id.click_again);
btn_reload.setOnClickListener(
new
OnClickListener() {
@Override
public
void
onClick(View v) {
//1.先显示loadingView
showLoadingView();
//2.点击的时候再一次重新加载数据
if
(listener!=
null
){
listener.onReload();
}
}
});
addView(errorView);
//3.添加空白的view
emptyView = View.inflate(getContext(), R.layout.empty_view,
null
);
addView(emptyView);
//4.加载成功的View在各界面是不同的,所以提供一个方法bindsucessview动态添加
//一开始隐藏所有的View
hideAll();
}
/**
* 添加一个成功的View进来
*/
public
void
bindSuccessView(View view){
successView = view;
if
(successView!=
null
){
successView.setVisibility(View.INVISIBLE);
//隐藏successView
//将它添加进来
addView(successView);
}
}
public
void
showSuccessView(){
//先隐藏其他的
hideAll();
if
(successView!=
null
){
successView.setVisibility(View.VISIBLE);
}
}
public
void
showEmptyView(){
//先隐藏其他的
hideAll();
emptyView.setVisibility(View.VISIBLE);
}
public
void
showErrorView(){
//先隐藏其他的
hideAll();
errorView.setVisibility(View.VISIBLE);
}
public
void
showLoadingView(){
//先隐藏其他的
hideAll();
loadingView.setVisibility(View.VISIBLE);
}
/**
* 隐藏所有的View
*/
public
void
hideAll(){
//设置各界面不可见,同时让他们不重新layout,要用的时候直接show就行了
loadingView.setVisibility(View.INVISIBLE);
errorView.setVisibility(View.INVISIBLE);
emptyView.setVisibility(View.INVISIBLE);
if
(successView!=
null
){
successView.setVisibility(View.INVISIBLE);
}
}
private
OnReloadListener listener;
public
void
setOnReloadListener(OnReloadListener listener){
this
.listener = listener;
}
public
interface
OnReloadListener{
/**
* 当重新加载的按钮被点击的时候调用
*/
void
onReload();
}
}
2.在界面中使用…因为切换各界面的时候,ToolBar是不变的,所以new一个垂直的LinearLayout上面放ToolBar,下面放我们自定义的FrameLayout用来切换界面。
package
com.ouyang.qqui.activity;
import
android.os.Bundle;
import
android.support.annotation.Nullable;
import
android.support.v4.widget.SwipeRefreshLayout;
import
android.support.v7.app.AppCompatActivity;
import
android.support.v7.widget.DefaultItemAnimator;
import
android.support.v7.widget.DividerItemDecoration;
import
android.support.v7.widget.LinearLayoutManager;
import
android.support.v7.widget.RecyclerView;
import
android.text.TextUtils;
import
android.view.View;
import
android.widget.LinearLayout;
import
com.ouyang.qqui.R;
import
com.ouyang.qqui.adapter.AddFootViewAdapter;
import
com.ouyang.qqui.adapter.MyRecycleradapter;
import
com.ouyang.qqui.adapter.ViewHolder;
import
com.ouyang.qqui.bean.UnReceiveListBean;
import
com.ouyang.qqui.net.BaseCallback;
import
com.ouyang.qqui.net.ConnectionUrl;
import
com.ouyang.qqui.net.HttpUtils;
import
com.ouyang.qqui.view.StateLayout;
import
java.util.ArrayList;
import
java.util.HashMap;
import
java.util.List;
import
java.util.Map;
import
butterknife.Bind;
import
butterknife.ButterKnife;
/**
* Create by oy 2017/6/15 13:50.
*/
public
class
ShowActivity
extends
AppCompatActivity {
private
StateLayout stateLayout;
@Override
protected
void
onCreate(
@Nullable
Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
initView();
//初始化界面
initData();
//初始化数据
}
private
void
initView() {
//为了增加ToolBar新建一个垂直的线性布局
LinearLayout lin =
new
LinearLayout(
this
);
lin.setOrientation(LinearLayout.VERTICAL);
//将ToolBar添加在上面
lin.addView(View.inflate(
this
, R.layout.activity_toolbar,
null
));
//将我们的各种界面添加在下面
stateLayout =
new
StateLayout(
this
);
lin.addView(stateLayout);
//添加一个加载成功的view
stateLayout.bindSuccessView(getsuccessView());
//绑定线性布局
setContentView(lin);
ButterKnife.bind(
this
);
//首先展示正在加载的view
stateLayout.showLoadingView();
}
public
View getsuccessView() {
View successView = View.inflate(
this
, R.layout.activity_rec,
null
);
return
successView;
}
private
void
initData() {
//初始化数据,请求网络,按照你的框架来,这里只做展示用
String url =
"哇哈哈哈"
;
HttpUtils.getInstance().get(url,
new
BaseCallback<String>() {
@Override
public
void
onFailure(
int
requstcode, Exception e) {
//加载失败展示错误的view
stateLayout.showErrorView();
}
@Override
public
void
onSuccess(String data) {
if
(TextUtils.isEmpty(data)){
//如果返回的数据为空,展示空界面
stateLayout.showEmptyView();
}
else
{
//如果数据不为空,展示成功的view
stateLayout.showSuccessView();
//继续噼里啪啦一大堆你的操作
// ...
}
}
});
}
}
3.Toolbar布局
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
android:orientation
=
"vertical"
android:layout_width
=
"match_parent"
android:layout_height
=
"?actionBarSize"
android:background
=
"@color/blue"
>
<
TextView
android:layout_width
=
"match_parent"
android:layout_height
=
"match_parent"
android:text
=
"Toolbar"
android:textSize
=
"18sp"
android:gravity
=
"center"
/>
</
android.support.v7.widget.Toolbar
>
4.其实还是觉得有点繁琐,暂时就先这样吧。这个StateLayout是我改编自不知道哪个哥们的,侵权立删。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK