3

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

 2 years ago
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开发中文站
你的位置:Android开发中文站 > 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.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 加载成功、加载失败、加载中、无数据四个不同界面的切换


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK