抽取的BaseFragment和LoadingPage
【BaseFragment】:
public abstract class BaseFragment extends Fragment {
/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
private LoadingPage loadingPage;
private ViewGroup container;
public boolean isInViewPager=false;//继承的Fragment是否存在于ViewPager中
//默认为false,如果fragment不是在viewpager中它的setUserVisibleHint方法不会执行,默认不可见
/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
private int isLoad=0;//是否已经加载过
private boolean isVisable;//是否可见
/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle
savedInstanceState) {
this.container=container;
loadingPage=updateLoadingPage();
return loadingPage;
} /*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
public LoadingPage updateLoadingPage(){
loadingPage=new LoadingPage(container.getContext()) {
@Override
public int getMyLayoutId() {
return getLayoutId();
} @Override
public RequestParams getMyParams() {
return getParams();
} @Override
public String getMyUrl() {
//如果Fragment不在ViewPager里,直接返回url
if(!isInViewPager){
return getUrl();
}
//如果Fragment在ViewPager里,需要分情况考虑
if(TextUtils.isEmpty(getUrl())){//本身就不需要联网
isLoad=1;
return getUrl();
}else{
if(isVisable){//需要联网,可见
isLoad=2;
return getUrl();
}else{//需要联网,不可见
isLoad=3;
return null;
}
} } @Override
public void onMySuccess(ReSultState reSultState, View successView) {
ButterKnife.bind(BaseFragment.this, successView);//绑定操作,第1个参数注意不能为this
initTitle();
initData(reSultState.getContent());
} };
return loadingPage; }
/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/ @Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
showLodingPage();
//为什么不直接写loadingPage.show()而要用方法showLodingPage()封装这句代码?
//因为showLodingPage()方法,可以使得BaseFragment的继承者都可以调用
//homeFragment=new HomeFragment();不会调用BaseFragment的onCreateView方法
//在commit()之后,Fragment的生命周期onCreateView才会执行
} /*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
public void showLodingPage(){
loadingPage.show();//联网操作——>改变联网状态——>替换掉正在加载的页面 //模拟联网耗时操作,正常情况下用上面这句代码即可
// UIUtils.getHandler().postDelayed(new Runnable() {
// @Override
// public void run() {
// loadingPage.show();
// }
// },2000); //还可以在LoadingPage的show()方法模拟联网耗时操作 }
/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
@Override
public void onDestroyView() {
super.onDestroyView();
ButterKnife.unbind(this);
}
/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
public abstract RequestParams getParams();
public abstract String getUrl();
public abstract int getLayoutId();
public abstract void initTitle();
public abstract void initData(String content);
/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
//处理ViewPager的每页是继承于BaseFragment的Fragment,预加载的情况
//最终实现的目标:取消ViewPager的预加载+缓存所有加载过的
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
isVisable=isVisibleToUser;
if(isInViewPager && isVisibleToUser && isLoad==3){
loadingPage.show();//这时候loadingPage一定不为null,因为isLoad==3表示已经初始化过
}
}
/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
}
【LoadingPage】:
public abstract class LoadingPage extends FrameLayout {
/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
private Context mContext; public static final int STATE_LOADING=1;
public static final int STATE_ERROR=2;
public static final int STATE_EMPTY=3;
public static final int STATE_SUCESS=4; public int state_current=STATE_LOADING; private View loadingView;
private View errorView;
private View emptyView;
private View successView; private LayoutParams params; /*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
public LoadingPage(Context context) {
this(context, null);
} public LoadingPage(Context context, AttributeSet attrs) {
this(context, attrs, 0);
} public LoadingPage(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.mContext=context;
init();
}
/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
private void init() {
params=new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
if(loadingView==null){
loadingView= UIUtils.getXmlView(R.layout.page_loading);
addView(loadingView,params);
}
if(errorView==null){
errorView= UIUtils.getXmlView(R.layout.page_error);
addView(errorView);
}
if(emptyView==null){
emptyView= UIUtils.getXmlView(R.layout.page_empty);
addView(emptyView);
}
showSafePage();
} /**
* 保证View的显示在主线程中执行
*/
private void showSafePage() {
UIUtils.runOnUiThread(new Runnable() {
@Override
public void run() {
showPage();
}
});
} private void showPage() {
loadingView.setVisibility(state_current==STATE_LOADING?VISIBLE:GONE);
errorView.setVisibility(state_current==STATE_ERROR?VISIBLE:GONE);
emptyView.setVisibility(state_current==STATE_EMPTY?VISIBLE:GONE);
if(successView==null){
successView=View.inflate(mContext,getMyLayoutId(),null);//Context:使用Fragment依赖的Activity实例
addView(successView,params);
}
successView.setVisibility(state_current==STATE_SUCESS?VISIBLE:GONE);
}
/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
private AsyncHttpClient client=new AsyncHttpClient();//联网工具
private ReSultState reSultState;//封装联网状态和数据的对象
public void show(){
//处理有些Fragment本身就不需要联网请求数据的情况,即该Fragment重写的getUrl方法直接return null
String url=getMyUrl();
if(TextUtils.isEmpty(url)){
state_current=STATE_SUCESS;
reSultState=ReSultState.SUCCESS;
reSultState.setContent("");
//这里将content设为"",那么在比如HomeFragment的initData一定要判断content是否为空
loadPage();
return;
}
//处理有些Fragment需要联网请求数据的情况,这时候该Fragment的getUrl()返回的是一个url
Runnable runnable=new Runnable() {
@Override
public void run() {
/*-------------------------------------------------------------------*/
//正常情况下的代码
AsyncHttpResponseHandler responseHandler=new AsyncHttpResponseHandler(){
@Override
public void onSuccess(String content) {//联网请求数据成功
//content="";//模拟请求数据为空
if(TextUtils.isEmpty(content)){
reSultState=ReSultState.EMPTY;
reSultState.setContent("");
}else{
reSultState=ReSultState.SUCCESS;
reSultState.setContent(content);
}
loadPage();
}
@Override
public void onFailure(Throwable error, String content) {//联网请求数据失败
reSultState=ReSultState.ERROR;
reSultState.setContent("");
loadPage();
}
};
client.get(getMyUrl(),getMyParams(),responseHandler);//getMyUrl(),getMyParams()由BaseFragment实现
/*-------------------------------------------------------------------*/
}
};
UIUtils.getHandler().post(runnable);
//UIUtils.getHandler().postDelayed(runnable, 2000);//模拟延时2秒,正常代码没有这个
} /**
* 根据resultState的状态和数据,更新当前加载状态state_current,如果是联网请求成功还需要
* 调用抽象方法onSuccess(resultState,content),在BaseFragment会实现这个抽象方法,
* 从而根据联网成功的数据加载页面
*/
private void loadPage() {
switch (reSultState) {
case SUCCESS:
state_current=STATE_SUCESS;
break;
case ERROR:
state_current=STATE_ERROR;
break;
case EMPTY:
state_current=STATE_EMPTY;
break;
} showSafePage(); if(state_current==STATE_SUCESS){
onMySuccess(reSultState,successView);
}
} /*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
/**
* 封装联网状态和请求结果的枚举类
*/
public enum ReSultState{
ERROR(2),EMPTY(3),SUCCESS(4);
private int state;
private String content;
ReSultState(int state) {
this.state=state;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/
// 抽象方法
public abstract int getMyLayoutId();
public abstract RequestParams getMyParams();
public abstract String getMyUrl();
public abstract void onMySuccess(ReSultState reSultState,View successView);
/*★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/ }
抽取的BaseFragment和LoadingPage的更多相关文章
- ViewPager的刷新、限制预加载、缓存所有
[框架]: 公共部分:左侧菜单.TitleBar.RadioGroup(3个RadioButton:X.Y.Z) 选择X页面:指示器+ViewPager [要达成的效果]: (1)左侧选择A,进入X页 ...
- Android主页Activity对多个Fragment实现不同的沉浸式标题(图片或者文字标题)
提示:讲解的该例实现是 FragmentTabHost + Fragment 实现: 1.示例效果图: 2.场景需求: 如示例图所示,在首页实现轮播图的沉浸,而 “发现” 和“我的”页是标题的沉浸. ...
- 高效抽取loading,再多的载入页面也不怕
当今的app基本上有两个操作,一个是载入数据 ,一个就是把数据显示到页面上.但假设页面特别的多.就每一个页面都要载入数据,就要写 loading 页面.我之前就是用dialog写,抽取出来一个类.哪里 ...
- 使用rowid抽取数据方法以及大数据量游标卡住的应对
平时工作的时候,经常会遇到这种事情,从一个大表A中,抽取字段a在一个相对较小B的表的数据,比如,从一个详单表中,抽取几万个用户号码的话单出来.这种时候,一般来说, 做关联查询: create tabl ...
- 写个Fragment方便的抽象基类 BaseFragment
package com.zb.zhihuianyang.base; import android.app.Activity; import android.os.Bundle; import andr ...
- TODO:从数据库中随机抽取一条记录
TODO:从数据库中随机抽取一条记录 1.最直接,最粗暴的方法先计算记录的总数,然后选择一个从0到记录总数之间的随机数n,利用skip跳过n条记录,这是效率低下的的方法,首先的记录总数,在用skip会 ...
- 【NLP】Tika 文本预处理:抽取各种格式文件内容
Tika常见格式文件抽取内容并做预处理 作者 白宁超 2016年3月30日18:57:08 摘要:本文主要针对自然语言处理(NLP)过程中,重要基础部分抽取文本内容的预处理.首先我们要意识到预处理的重 ...
- SQL Server 随机数,随机区间,随机抽取数据rand(),floor(),ceiling(),round(),newid()函数等
在查询分析器中执行:select rand(),可以看到结果会是类似于这样的随机小数:0.36361513486289558,像这样的小数在实际应用中用得不多,一般要取随机数都会取随机整数.那就看下面 ...
- Android 谈谈封装那些事 --BaseActivity 和 BaseFragment(二)
1.前言 昨天谈了BaseActivity的封装,Android谈谈封装那些事--BaseActivity和BaseFragment(一)有很多小伙伴提了很多建议,比如: 通用标题栏可以自定义Vi ...
随机推荐
- 用 flow.ci 让 Hexo 持续部署
编者按:感谢 @小小小杜 投稿,原文链接Juglans' Blog.如果你也想体验 flow.ci 的自动化持续部署,来 http://flow.ci 首页提交申请,邀请码随后会发送到邮箱:) flo ...
- iOS 和 Android 测试托管平台 FIR.im 的注册与常用功能
FIR.im 作为专业的 iOS 和 Android 测试包发布网站, 注册超简单,支持输入网址直接下载和二维码扫描下载.功能类似 TestFlight ,但又比它强大,支持游客访问密码,iOS 和 ...
- Tomcat源码解读系列(一)——server.xml文件的配置
Tomcat是J2EE开发人员最常用到的开发工具,在Java Web应用的调试开发和实际部署中,我们都可以看到Tomcat的影子.大多数时候,我们可以将Tomcat当做一个黑盒来看待,只需要将编写的J ...
- javascript_core_08之闭包、对象、原型
1.闭包: ①外层函数包裹受保护的变量和操作变量的内层函数: ②外层函数将内层函数返回到外部: ③调用外部函数,获得内层函数的对象: 2.面向对象:用对象描述现实一个具体事物属性和功能,按需调用功能, ...
- andriod adt和andriod sdk
今天搭建appium的环境,没有太明白andriod adt和andriod sdk分别是什么东西,经过与开发沟通,大致了解如下,这里记录一下,免得过几天就搞忘了. andriod adt是一个插件, ...
- 通过Class获取标签,兼容的几种思路
在js中通过document.getElementsByClassName()在低版本IE浏览器中不兼容.然后我写了几种方案,大家可以参考参考. html代码 <!DOCTYPE html> ...
- 信息加密之非对称加密DH算法
非对称加密算法是相对于对称加密算法来说的,对于对称加密算法请查阅之前的总结,今天为大家介绍一下DH算法,DH是一种密钥交换算法,接收方根据发送方加密时的密钥,生成接收方解密密钥.下面就一起来学习一下吧 ...
- codeforce Pashmak and Buses(dfs枚举)
/* 题意:n个同学,k个车, 取旅游d天! 要求所有的学生没有两个或者两个以上的在同一辆车上共同带d天! 输出可行的方案! 对于d行n列的矩阵,第i行第j列表示的是第i天第j个同学所在的车号! 也就 ...
- JAVA编程“性能说”(java编程需要做的26件事)
转载于 http://www.csdn.net/article/2012-06-01/2806249 最近的机器内存又爆满了,除了新增机器内存外,还应该好好review一下我们的代码,有很多代码编写过 ...
- Mybatis学习错误之:重复加载mapper.xml
学习mybatis的时候,突然遇到测试出错.测试mapper代理失败,现在钻研少了,不喜欢看未知的错误了,立即改正.错误打印说mapper.xml已经注册,仔细查看SQLMapConfig.xml发现 ...