原标题:Android 加载成功、加载失败、加载中、无数据四个不同界面的切换
自定义一个Framelayout来切换布局。
1.首先自定义一个Framelayout,用addview()把加载失败、加载中、无数据添加到Framelayout;因为加载成功的view是随时变化的,所以提供bindSuccessView()方法添加。
importandroid.content.Context;
importandroid.util.AttributeSet;
importandroid.view.View;
importandroid.widget.Button;
importandroid.widget.FrameLayout;
importcom.ouyang.qqui.R;
publicclassStateLayoutextendsFrameLayout{
privateView loadingView;
privateView errorView;
privateView successView;
privateView emptyView;
publicStateLayout(Context context){
this(context, null);
}
publicStateLayout(Context context, AttributeSet attrs){
this(context, attrs, 0);
}
publicStateLayout(Context context, AttributeSet attrs, intdefStyleAttr){
super(context, attrs, defStyleAttr);
initView(); //初始化View
}
/**
* 添加那4个子View:加载中的,加载成功的,加载没有数据,加载失败的
*/
privatevoidinitView(){
//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( newOnClickListener() {
@Override
publicvoidonClick(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进来
*/
publicvoidbindSuccessView(View view){
successView = view;
if(successView!= null){
successView.setVisibility(View.INVISIBLE); //隐藏successView
//将它添加进来
addView(successView);
}
}
publicvoidshowSuccessView(){
//先隐藏其他的
hideAll();
if(successView!= null){
successView.setVisibility(View.VISIBLE);
}
}
publicvoidshowEmptyView(){
//先隐藏其他的
hideAll();
emptyView.setVisibility(View.VISIBLE);
}
publicvoidshowErrorView(){
//先隐藏其他的
hideAll();
errorView.setVisibility(View.VISIBLE);
}
publicvoidshowLoadingView(){
//先隐藏其他的
hideAll();
loadingView.setVisibility(View.VISIBLE);
}
/**
* 隐藏所有的View
*/
publicvoidhideAll(){
//设置各界面不可见,同时让他们不重新layout,要用的时候直接show就行了
loadingView.setVisibility(View.INVISIBLE);
errorView.setVisibility(View.INVISIBLE);
emptyView.setVisibility(View.INVISIBLE);
if(successView!= null){
successView.setVisibility(View.INVISIBLE);
}
}
privateOnReloadListener listener;
publicvoidsetOnReloadListener(OnReloadListener listener){
this.listener = listener;
}
publicinterfaceOnReloadListener{
/**
* 当重新加载的按钮被点击的时候调用
*/
voidonReload();
}
}
2.在界面中使用…因为切换各界面的时候,ToolBar是不变的,所以new一个垂直的LinearLayout上面放ToolBar,下面放我们自定义的FrameLayout用来切换界面。
packagecom.ouyang.qqui.activity;
importandroid.os.Bundle;
importandroid.support.annotation.Nullable;
importandroid.support.v4.widget.SwipeRefreshLayout;
importandroid.support.v7.app.AppCompatActivity;
importandroid.support.v7.widget.DefaultItemAnimator;
importandroid.support.v7.widget.DividerItemDecoration;
importandroid.support.v7.widget.LinearLayoutManager;
importandroid.support.v7.widget.RecyclerView;
importandroid.text.TextUtils;
importandroid.view.View;
importandroid.widget.LinearLayout;
importcom.ouyang.qqui.R;
importcom.ouyang.qqui.adapter.AddFootViewAdapter;
importcom.ouyang.qqui.adapter.MyRecycleradapter;
importcom.ouyang.qqui.adapter.ViewHolder;
importcom.ouyang.qqui.bean.UnReceiveListBean;
importcom.ouyang.qqui.net.BaseCallback;
importcom.ouyang.qqui.net.ConnectionUrl;
importcom.ouyang.qqui.net.HttpUtils;
importcom.ouyang.qqui.view.StateLayout;
importjava.util.ArrayList;
importjava.util.HashMap;
importjava.util.List;
importjava.util.Map;
importbutterknife.Bind;
importbutterknife.ButterKnife;
/**
* Create by oy 2017/6/15 13:50.
*/
publicclassShowActivityextendsAppCompatActivity{
privateStateLayout stateLayout;
@Override
protectedvoidonCreate(@Nullable Bundle savedInstanceState){
super.onCreate(savedInstanceState);
initView(); //初始化界面
initData(); //初始化数据
}
privatevoidinitView(){
//为了增加ToolBar新建一个垂直的线性布局
LinearLayout lin = newLinearLayout( this);
lin.setOrientation(LinearLayout.VERTICAL);
//将ToolBar添加在上面
lin.addView(View.inflate( this, R.layout.activity_toolbar, null));
//将我们的各种界面添加在下面
stateLayout = newStateLayout( this);
lin.addView(stateLayout);
//添加一个加载成功的view
stateLayout.bindSuccessView(getsuccessView());
//绑定线性布局
setContentView(lin);
ButterKnife.bind( this);
//首先展示正在加载的view
stateLayout.showLoadingView();
}
publicView getsuccessView(){
View successView = View.inflate( this, R.layout.activity_rec, null);
returnsuccessView;
}
privatevoidinitData(){
//初始化数据,请求网络,按照你的框架来,这里只做展示用
String url = "哇哈哈哈";
HttpUtils.getInstance().get(url, newBaseCallback() {
@Override
publicvoidonFailure(intrequstcode, Exception e){
//加载失败展示错误的view
stateLayout.showErrorView();
}
@Override
publicvoidonSuccess(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"
>
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Toolbar"
android:textSize="18sp"
android:gravity="center"/>
4.其实还是觉得有点繁琐,暂时就先这样吧。这个StateLayout是我改编自不知道哪个哥们的,侵权立删。返回搜狐,查看更多
责任编辑: