package com.example.jingbin.cloudreader.base;
import android.databinding.DataBindingUtil;
import android.databinding.ViewDataBinding;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import com.example.jingbin.cloudreader.R;
import com.example.jingbin.cloudreader.utils.PerfectClickListener;
import rx.Subscription;
import rx.subscriptions.CompositeSubscription;
/**
* 是没有title的Fragment
*/
public abstract class BaseFragment<SV extends ViewDataBinding> extends Fragment {
// 布局view
protected SV bindingView;
// fragment是否显示了
protected boolean mIsVisible = false;
// 加载中
private LinearLayout mLlProgressBar;
// 加载失败
private LinearLayout mRefresh;
// 内容布局
protected RelativeLayout mContainer;
// 动画
private AnimationDrawable mAnimationDrawable;
private CompositeSubscription mCompositeSubscription;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View ll = inflater.inflate(R.layout.fragment_base, null);
bindingView = DataBindingUtil.inflate(getActivity().getLayoutInflater(), setContent(), null, false);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
bindingView.getRoot().setLayoutParams(params);
mContainer = (RelativeLayout) ll.findViewById(R.id.container);
mContainer.addView(bindingView.getRoot());
return ll;
}
/**
* 在这里实现Fragment数据的缓加载.
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (getUserVisibleHint()) {
mIsVisible = true;
onVisible();
} else {
mIsVisible = false;
onInvisible();
}
}
protected void onInvisible() {
}
/**
* 显示时加载数据,需要这样的使用
* 注意声明 isPrepared,先初始化
* 生命周期会先执行 setUserVisibleHint 再执行onActivityCreated
* 在 onActivityCreated 之后第一次显示加载数据,只加载一次
*/
protected void loadData() {
}
protected void onVisible() {
loadData();
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mLlProgressBar = getView(R.id.ll_progress_bar);
ImageView img = getView(R.id.img_progress);
// 加载动画
mAnimationDrawable = (AnimationDrawable) img.getDrawable();
// 默认进入页面就开启动画
if (!mAnimationDrawable.isRunning()) {
mAnimationDrawable.start();
}
mRefresh = getView(R.id.ll_error_refresh);
// 点击加载失败布局
mRefresh.setOnClickListener(new PerfectClickListener() {
@Override
protected void onNoDoubleClick(View v) {
showLoading();
onRefresh();
}
});
bindingView.getRoot().setVisibility(View.GONE);
}
protected <T extends View> T getView(int id) {
return (T) getView().findViewById(id);
}
/**
* 布局
*/
public abstract int setContent();
/**
* 加载失败后点击后的操作
*/
protected void onRefresh() {
}
/**
* 显示加载中状态
*/
protected void showLoading() {
if (mLlProgressBar.getVisibility() != View.VISIBLE) {
mLlProgressBar.setVisibility(View.VISIBLE);
}
// 开始动画
if (!mAnimationDrawable.isRunning()) {
mAnimationDrawable.start();
}
if (bindingView.getRoot().getVisibility() != View.GONE) {
bindingView.getRoot().setVisibility(View.GONE);
}
if (mRefresh.getVisibility() != View.GONE) {
mRefresh.setVisibility(View.GONE);
}
}
/**
* 加载完成的状态
*/
protected void showContentView() {
if (mLlProgressBar.getVisibility() != View.GONE) {
mLlProgressBar.setVisibility(View.GONE);
}
// 停止动画
if (mAnimationDrawable.isRunning()) {
mAnimationDrawable.stop();
}
if (mRefresh.getVisibility() != View.GONE) {
mRefresh.setVisibility(View.GONE);
}
if (bindingView.getRoot().getVisibility() != View.VISIBLE) {
bindingView.getRoot().setVisibility(View.VISIBLE);
}
}
/**
* 加载失败点击重新加载的状态
*/
protected void showError() {
if (mLlProgressBar.getVisibility() != View.GONE) {
mLlProgressBar.setVisibility(View.GONE);
}
// 停止动画
if (mAnimationDrawable.isRunning()) {
mAnimationDrawable.stop();
}
if (mRefresh.getVisibility() != View.VISIBLE) {
mRefresh.setVisibility(View.VISIBLE);
}
if (bindingView.getRoot().getVisibility() != View.GONE) {
bindingView.getRoot().setVisibility(View.GONE);
}
}
public void addSubscription(Subscription s) {
if (this.mCompositeSubscription == null) {
this.mCompositeSubscription = new CompositeSubscription();
}
this.mCompositeSubscription.add(s);
}
@Override
public void onDestroy() {
super.onDestroy();
if (this.mCompositeSubscription != null && mCompositeSubscription.hasSubscriptions()) {
this.mCompositeSubscription.unsubscribe();
}
}
public void removeSubscription() {
if (this.mCompositeSubscription != null && mCompositeSubscription.hasSubscriptions()) {
this.mCompositeSubscription.unsubscribe();
}
}
}