最新消息:欢迎访问Android开发中文站!商务联系QQ:1304524325

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

新手入门 loading 2645浏览 0评论
自定义一个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.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是我改编自不知道哪个哥们的,侵权立删。

转载请注明:Android开发中文站 » Android 加载成功、加载失败、加载中、无数据四个不同界面的切换

您必须 登录 才能发表评论!