android 加载成功失败,Android 加载成功、加载失败、加载中、无数据四个不同界面的切换...

原标题: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是我改编自不知道哪个哥们的,侵权立删。返回搜狐,查看更多

责任编辑:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值