您的位置:首页 > 移动开发 > Android开发

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

2017-06-27 19:58 423 查看
自定义一个Framelayout来切换布局。

1.首先自定义一个Framelayout,用addview()把加载失败、加载中、无数据添加到Framelayout;因为加载成功的view是随时变化的,所以提供bindSuccessView()方法添加。

package com.ouyang.qqui.view;
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.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
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是我改编自不知道哪个哥们的,侵权立删。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐