Commit 69f3ec50 by 罗翻

fragment增加懒加载

parent 83a71781
......@@ -21,11 +21,9 @@ public abstract class BaseFragment<T extends BasePresenter, E extends BaseModel>
public T mPresenter;
public E mModel;
private Unbinder mKnife;
/**
* 视图是否已经初初始化
*/
protected boolean isInit = false;
protected boolean isLoad = false;
private boolean isVisible; //是否可见状态
private boolean isPrepared; //标志位,View已经初始化完成。
private boolean isFirstLoad = true;
@Override
......@@ -39,6 +37,8 @@ public abstract class BaseFragment<T extends BasePresenter, E extends BaseModel>
super.onCreate(savedInstanceState);
mPresenter = TUtil.getT(this, 0);
mModel = TUtil.getT(this, 1);
isFirstLoad = true;
isPrepared = true;
if (this instanceof BaseView) mPresenter.setVM(this, mModel, mContext);
}
......@@ -48,8 +48,6 @@ public abstract class BaseFragment<T extends BasePresenter, E extends BaseModel>
View view = inflater.inflate(getLayoutId(), container, false);
mKnife = ButterKnife.bind(this, view);
initView(view);
isInit = true;
isCanLoadData();
return view;
}
......@@ -66,54 +64,50 @@ public abstract class BaseFragment<T extends BasePresenter, E extends BaseModel>
/**
* 视图是否已经对用户可见,系统的方法
* 如果是与ViewPager一起使用,调用的是setUserVisibleHint
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
isCanLoadData();
}
/**
* 是否可以加载数据
* 可以加载数据的条件:
* 1.视图已经初始化
* 2.视图对用户可见
*/
private void isCanLoadData() {
if (!isInit) {
return;
}
if (getUserVisibleHint()) {
lazyLoad();
isLoad = true;
isVisible = true;
onVisible();
} else {
if (isLoad) {
stopLoad();
}
isVisible = false;
onInvisible();
}
}
/**
* 视图销毁的时候讲Fragment是否初始化的状态变为false
* 如果是通过FragmentTransaction的show和hide的方法来控制显示,调用的是onHiddenChanged.
* 若是初始就show的Fragment 为了触发该事件 需要先hide再show
*/
@Override
public void onDestroyView() {
super.onDestroyView();
isInit = false;
isLoad = false;
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
if (!hidden) {
isVisible = true;
onVisible();
} else {
isVisible = false;
onInvisible();
}
}
protected void onVisible() {
doInit();
}
/**
* 当视图初始化并且对用户可见的时候去真正的加载数据
*/
protected abstract void lazyLoad();
protected void onInvisible() {
}
/**
* 当视图已经对用户不可见并且加载过数据,如果需要在切换到其他页面时停止加载数据,可以覆写此方法
*/
protected void stopLoad() {
protected void doInit() {
if (!isPrepared || !isVisible || !isFirstLoad) {
return;
}
isFirstLoad = false;
lazyLoad();
}
protected abstract void lazyLoad();
}
......@@ -14,6 +14,7 @@ import com.dayu.bigfish.R;
import com.dayu.bigfish.ui.adapter.FragmentOrderAdapter;
import com.dayu.bigfish.ui.fragment.OrderDatailsFragment;
import com.dayu.bigfish.ui.fragment.OrderDatailsServeFragment;
import com.dayu.bigfish.utils.TabLayoutUtils;
import java.util.ArrayList;
import java.util.List;
......@@ -72,7 +73,7 @@ public class OrderDetailsActivity extends FragmentActivity {
tablayout.addTab(tablayout.newTab().setText("工单详情"));
tablayout.addTab(tablayout.newTab().setText("服务记录"));
tablayout.setTabMode(TabLayout.MODE_FIXED);
TabLayoutUtils.setIndicator(tablayout, 60, 60, R.color.cl_receiving_order_item_data, this);
}
@OnClick({R.id.order_back, R.id.tablayout})
......
......@@ -7,11 +7,12 @@ import android.support.v4.view.ViewPager;
import android.view.View;
import com.dayu.bigfish.R;
import com.dayu.bigfish.ui.adapter.FragmentOrderAdapter;
import com.dayu.bigfish.base.BaseFragment;
import com.dayu.bigfish.presenter.homethiirdtab.HomeThirdContract;
import com.dayu.bigfish.presenter.homethiirdtab.HomeThirdModel;
import com.dayu.bigfish.presenter.homethiirdtab.HomeThirdPresenter;
import com.dayu.bigfish.ui.adapter.FragmentOrderAdapter;
import com.dayu.bigfish.utils.TabLayoutUtils;
import java.util.ArrayList;
import java.util.List;
......@@ -39,7 +40,6 @@ public class HomeMessageTabFragment extends BaseFragment<HomeThirdPresenter, Hom
@Override
public View initView(View view) {
initData();
return view;
}
......@@ -50,7 +50,7 @@ public class HomeMessageTabFragment extends BaseFragment<HomeThirdPresenter, Hom
@Override
protected void lazyLoad() {
initData();
}
......@@ -65,6 +65,7 @@ public class HomeMessageTabFragment extends BaseFragment<HomeThirdPresenter, Hom
messageTablayout.addTab(messageTablayout.newTab().setText("系统通知"));
messageTablayout.addTab(messageTablayout.newTab().setText("大鱼通知"));
messageTablayout.setTabMode(TabLayout.MODE_FIXED);
TabLayoutUtils.setIndicator(messageTablayout, 60, 60, R.color.cl_receiving_order_item_data, getActivity());
}
}
......@@ -10,7 +10,6 @@ import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.dayu.bigfish.R;
......@@ -25,9 +24,8 @@ import com.dayu.bigfish.ui.WorksRecordActivity;
import com.dayu.bigfish.ui.adapter.FragmentHomeAdapter;
import com.dayu.bigfish.utils.GetUserInfo;
import com.dayu.bigfish.utils.ProgressUtil;
import com.dayu.bigfish.utils.UtilsScreen;
import com.dayu.bigfish.utils.TabLayoutUtils;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
......@@ -128,49 +126,8 @@ public class HomeOrderFragment extends BaseFragment<HomeSecondPresenter, HomeSec
homeTabLayout.setupWithViewPager(mViewPager);
homeTabLayout.setTabMode(TabLayout.MODE_FIXED);
mViewPager.setCurrentItem(0);
/**
* 此处是通过反射更改TabLayout下划线的宽度
* */
homeTabLayout.post(new Runnable() {
@Override
public void run() {
try {
//拿到tabLayout的mTabStrip属性
Field mTabStripField = homeTabLayout.getClass().getDeclaredField("mTabStrip");
mTabStripField.setAccessible(true);
LinearLayout mTabStrip = (LinearLayout) mTabStripField.get(homeTabLayout);
int dp10 = UtilsScreen.dip2px(mActivity, 10);
for (int i = 0; i < mTabStrip.getChildCount(); i++) {
View tabView = mTabStrip.getChildAt(i);
//拿到tabView的mTextView属性
Field mTextViewField = tabView.getClass().getDeclaredField("mTextView");
mTextViewField.setAccessible(true);
TextView mTextView = (TextView) mTextViewField.get(tabView);
tabView.setPadding(0, 0, 0, 0);
//因为想要的效果是 字多宽线就多宽,所以测量mTextView的宽度
int width = 0;
width = mTextView.getWidth();
if (width == 0) {
mTextView.measure(0, 0);
width = mTextView.getMeasuredWidth();
}
//设置tab左右间距为10dp 注意这里不能使用Padding 因为源码中线的宽度是根据 tabView的宽度来设置的
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) tabView.getLayoutParams();
params.width = width;
params.leftMargin = dp10;
params.rightMargin = dp10;
tabView.setLayoutParams(params);
tabView.invalidate();
}
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
homeTabLayout.post(() -> {
TabLayoutUtils.setIndicator(homeTabLayout, 15, 15, R.color.cl_order_item_line_bg, mActivity);
});
homeTabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
/**
......@@ -238,6 +195,7 @@ public class HomeOrderFragment extends BaseFragment<HomeSecondPresenter, HomeSec
});
}
/**
* 请求服务器数据获取tab各状态的数量
*/
......@@ -327,4 +285,5 @@ public class HomeOrderFragment extends BaseFragment<HomeSecondPresenter, HomeSec
public void getTabNumSuccess(Tab tab) {
setTabNum(tab, mTabIndex);
}
}
......@@ -79,6 +79,7 @@ public class HomePersonFragment extends BaseFragment<HomeFourPresenter, HomeFour
private String userPhone;
private String evaluate;
private int mAccountBalance;
private boolean isFirst = true;
public static HomePersonFragment newInstance() {
Bundle args = new Bundle();
......@@ -116,6 +117,7 @@ public class HomePersonFragment extends BaseFragment<HomeFourPresenter, HomeFour
return R.layout.activity_personal_center;
}
@Override
protected void lazyLoad() {
ProgressUtil.startLoad(mContext);
......
......@@ -55,14 +55,14 @@ public class OrderFirstTabFragment extends BaseFragment<OrderTabPresenter, Order
mAdapter.disableLoadMoreIfNotFullPage(mRecyclerView);
mRefreshLayout.setOnRefreshListener(this);
mAdapter.setOnLoadMoreListener(this, mRecyclerView);
ProgressUtil.startLoad(mContext);
mPresenter.getWatingOrder(Constants.APPOIMENT_ORDER, userId, siteId, mPage, mPageSize);
initListener();
return view;
}
@Override
protected void lazyLoad() {
ProgressUtil.startLoad(mContext);
mPresenter.getWatingOrder(Constants.APPOIMENT_ORDER, userId, siteId, mPage, mPageSize);
}
@Override
......
package com.dayu.bigfish.utils;
import android.app.Activity;
import android.content.res.Resources;
import android.support.design.widget.TabLayout;
import android.util.TypedValue;
import android.view.View;
import android.widget.LinearLayout;
import java.lang.reflect.Field;
/**
* Created by luofan on 2017/11/24.
*/
public class TabLayoutUtils {
/**
* @author Dell
* @time 2017/9/11 10:54
* @description: tabLayout 下划线 长度
*/
/**
* tabLayout 下划线 长度
*/
public static void setIndicator(TabLayout tabs, int leftDip, int rightDip, int color, Activity activity) {
Class<?> tabLayout = tabs.getClass();
Field tabStrip = null;
try {
tabStrip = tabLayout.getDeclaredField("mTabStrip");
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
tabStrip.setAccessible(true);
LinearLayout llTab = null;
try {
llTab = (LinearLayout) tabStrip.get(tabs);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
int left = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, leftDip, Resources.getSystem().getDisplayMetrics());
int right = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, rightDip, Resources.getSystem().getDisplayMetrics());
for (int i = 0; i < llTab.getChildCount(); i++) {
View child = llTab.getChildAt(i);
child.setPadding(0, 0, 0, 0);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 1);
params.leftMargin = left;
params.rightMargin = right;
child.setLayoutParams(params);
child.invalidate();
}
tabs.setSelectedTabIndicatorColor(activity.getResources().getColor(color));
}
}
......@@ -5,7 +5,7 @@ buildscript {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.0'
classpath 'com.android.tools.build:gradle:3.0.1'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.0'
// NOTE: Do not place your application dependencies here; they belong
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment