本文实例讲述了AndroID开发实现自定义新闻加载页面功能。分享给大家供大家参考,具体如下:
一、概述:
1、效果演示:
2、说明:在新闻页面刚加载的时候,一般会出现五种状态
未知状态(STATE_UNKNow)、空状态(STATE_EMPTY)、加载中(STATE_LOADING)、错误(STATE_ERROT)、成功(STATE_SUCCESS)
因为每个Detail页面都会出现,所以我们可以把他们封装成一个LoadPage的自定义view,可以复用
二、实现:
1、首先的定义三个布局,为什么是三个,因为unkonw与loading的页面可以使用同一个,而success的页面是加载数据的页面,这里不用定义
1)loading页面布局,只有一个进度条
<?xml version="1.0" enCoding="utf-8"?><relativeLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" > <Progressbar androID:layout_wIDth="wrap_content" androID:layout_height="wrap_content" androID:layout_centerHorizontal="true" androID:layout_centerVertical="true" /></relativeLayout>
2)空页面只有一张图片,显示没有数据
<?xml version="1.0" enCoding="utf-8"?><relativeLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" > <ImageVIEw androID:layout_wIDth="wrap_content" androID:layout_height="wrap_content" androID:layout_centerHorizontal="true" androID:layout_centerVertical="true" androID:src="@drawable/ic_empty_page" /></relativeLayout>
3)错误页面有一张错误图片与按钮,点击按钮重新加载数据
<?xml version="1.0" enCoding="utf-8"?><FrameLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" androID:orIEntation="vertical" > <relativeLayout androID:layout_wIDth="match_parent" androID:layout_height="match_parent" androID:gravity="center" > <ImageVIEw androID:ID="@+ID/page_iv" androID:layout_wIDth="100dp" androID:layout_height="100dp" androID:layout_centerHorizontal="true" androID:scaleType="centerInsIDe" androID:src="@drawable/ic_error_page" /> <button androID:ID="@+ID/page_bt" androID:layout_wIDth="wrap_content" androID:layout_height="34dp" androID:layout_below="@ID/page_iv" androID:layout_centerHorizontal="true" androID:layout_margintop="10dp" androID:background="@drawable/btn_bg" androID:ellipsize="end" androID:paddingleft="10dp" androID:paddingRight="10dp" androID:singleline="true" androID:text="@string/load_error" androID:textcolor="#ff717171" androID:textSize="14dp" /> </relativeLayout></FrameLayout>
4、初始化控件
/*** 初始化加载三种布局*/private voID init() { mloadingVIEw = initVIEw(R.layout.loadpage_loading); mEmptyVIEw = initVIEw(R.layout.loadpage_empty); mErrorVIEw = initVIEw(R.layout.loadpage_error); //如果发生错误,点击重新加载 button btnError = (button) mErrorVIEw.findVIEwByID(R.ID.page_bt); btnError.setonClickListener(new OnClickListener() { @OverrIDe public voID onClick(VIEw v) { show(); } }); showPages();}
5、全部代码:
/** * @描述 加载页面 * @项目名称 App_Shop * @包名 com.androID.shop.vIEw * @类名 LoadingPage * @author chenlin * @date 2014年3月29日 下午8:49:39 */public abstract class LoadingPage extends FrameLayout { private final static int STATE_UNKNow = 0; private final static int STATE_LOADING = 1; private final static int STATE_ERROT = 2; private final static int STATE_EMPTY = 3; private final static int STATE_SUCCESS = 4; // 不能使用静态的, private int currentState = STATE_UNKNow; private VIEw mloadingVIEw; // 加载 private VIEw mEmptyVIEw; // 空页面 private VIEw mErrorVIEw; // 网络错误 private VIEw mSuccessVIEw; // 加载成功后的页面 private Context mContext; /** * 定义枚举类型 */ public enum LoadResult { error(STATE_ERROT),empty(STATE_EMPTY),success(STATE_SUCCESS); int value; LoadResult(int value) { this.value = value; } public int getValue() { return value; } } public LoadingPage(Context context,AttributeSet attrs,int defStyle) { super(context,attrs,defStyle); mContext = context; init(); } public LoadingPage(Context context,AttributeSet attrs) { this(context,0); } public LoadingPage(Context context) { this(context,null); } /** * 初始化加载三种布局 */ private voID init() { mloadingVIEw = initVIEw(R.layout.loadpage_loading); mEmptyVIEw = initVIEw(R.layout.loadpage_empty); mErrorVIEw = initVIEw(R.layout.loadpage_error); //如果发生错误,点击重新加载 button btnError = (button) mErrorVIEw.findVIEwByID(R.ID.page_bt); btnError.setonClickListener(new OnClickListener() { @OverrIDe public voID onClick(VIEw v) { show(); } }); showPages(); } public VIEw initVIEw(int resID) { VIEw vIEw = VIEw.inflate(mContext,resID,null); if (vIEw != null) { this.addVIEw(vIEw,new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT)); return vIEw; } return null; } private voID showPages() { //加载页面显示与不显示 mloadingVIEw.setVisibility(currentState == STATE_UNKNow || currentState == STATE_LOADING ? VIEw.VISIBLE : VIEw.GONE); //空页面 mEmptyVIEw.setVisibility(currentState == STATE_EMPTY ? VIEw.VISIBLE : VIEw.GONE); //错误页面显示 mErrorVIEw.setVisibility(currentState == STATE_ERROT ? VIEw.VISIBLE : VIEw.GONE); //如果数据加载成功了, if (currentState == STATE_SUCCESS) { if (mSuccessVIEw == null) { //加载成功页面信息,成功后的页面就是新闻页面信息 mSuccessVIEw = createSuccessVIEw(); //添加页面到framelayout里 addVIEw(mSuccessVIEw,LayoutParams.MATCH_PARENT)); mSuccessVIEw.setVisibility(VIEw.VISIBLE); }else { mSuccessVIEw.setVisibility(VIEw.GONE); } } } public voID show() { if (currentState == STATE_EMPTY || currentState == STATE_ERROT) { currentState = STATE_LOADING; } // 请求服务器 获取服务器上数据 进行判断 // 请求服务器 返回一个结果 ThreadManager.getInstance().createLongPool().execute(new Runnable() { @OverrIDe public voID run() { //从服务器加载数据,得到返回的状态信息 final LoadResult result = loadFromServer(); if (result != null) { Util.runOnUiThread(new Runnable() { @OverrIDe public voID run() { currentState = result.getValue(); //显示 showPages(); } }); } } }); showPages(); } public abstract VIEw createSuccessVIEw(); public abstract LoadResult loadFromServer();}
三、使用:
/** * @描述 fragment * @项目名称 App_Shop * @包名 com.androID.shop.fragment * @类名 BaseFragment * @author chenlin * @date 2014年3月28日 下午10:33:59 */public abstract class BaseFragment<T> extends Fragment { private LoadingPage mloadingPage; @OverrIDe public VIEw onCreateVIEw(LayoutInflater inflater,VIEwGroup container,Bundle savedInstanceState) { if (mloadingPage == null) { mloadingPage = new LoadingPage(getActivity()){ @OverrIDe public VIEw createSuccessVIEw() { return BaseFragment.this.createSuccessVIEw(); } @OverrIDe public LoadResult loadFromServer() { return BaseFragment.this.load(); } }; }else { VIEwUtil.removeParent(mloadingPage); } return mloadingPage; } /*** * 创建成功的界面 * @return */ public abstract VIEw createSuccessVIEw(); /** * 从服务器得到结果吗 * @return */ protected abstract LoadResult load(); /** * 显示加载页面 */ public voID show(){ if (mloadingPage != null) { mloadingPage.show(); } } /**校验数据 */ public LoadResult checkData(List<T> datas){ if (datas == null) { return LoadResult.error; }else { if (datas.size() == 0) { return LoadResult.empty; }else { return LoadResult.success; } } }}
更多关于AndroID相关内容感兴趣的读者可查看本站专题:《Android开发入门与进阶教程》、《Android调试技巧与常见问题解决方法汇总》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》
希望本文所述对大家AndroID程序设计有所帮助。
总结以上是内存溢出为你收集整理的Android开发实现自定义新闻加载页面功能实例全部内容,希望文章能够帮你解决Android开发实现自定义新闻加载页面功能实例所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)