本文实例讲述了Android开发实现自定义新闻加载页面功能。分享给大家供大家参考,具体如下:

一、概述:

1、效果演示:

2、说明:在新闻页面刚加载的时候,一般会出现五种状态

未知状态(STATE_UNKNOW)、空状态(STATE_EMPTY)、加载中(STATE_LOADING)、错误(STATE_ERROT)、成功(STATE_SUCCESS)

因为每个Detail页面都会出现,所以我们可以把他们封装成一个LoadPage的自定义view,可以复用

二、实现:

1、首先的定义三个布局,为什么是三个,因为unkonw与loading的页面可以使用同一个,而success的页面是加载数据的页面,这里不用定义

1)loading页面布局,只有一个进度条

android:layout_width="match_parent"

android:layout_height="match_parent" >

style="?android:attr/progressBarStyleLarge"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerHorizontal="true"

android:layout_centerVertical="true" />

2)空页面只有一张图片,显示没有数据

android:layout_width="match_parent"

android:layout_height="match_parent" >

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerHorizontal="true"

android:layout_centerVertical="true"

android:src="@drawable/ic_empty_page" />

3)错误页面有一张错误图片与按钮,点击按钮重新加载数据

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical" >

android:layout_width="match_parent"

android:layout_height="match_parent"

android:gravity="center" >

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" />

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" />

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, attrs, 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, new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT,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 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 datas){

if (datas == null) {

return LoadResult.error;

}else {

if (datas.size() == 0) {

return LoadResult.empty;

}else {

return LoadResult.success;

}

}

}

}

希望本文所述对大家Android程序设计有所帮助。

android实现新闻内容显示功能,Android开发实现自定义新闻加载页面功能实例相关推荐

  1. android实现新闻内容显示功能,Android 类似新闻界面评论框

    /** * 初始化dialog */ private void showDialog() { Dialog dialog =new Dialog(this); dialog.requestWindow ...

  2. Android高效率编码-第三方SDK详解系列(二)——Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能

    Android高效率编码-第三方SDK详解系列(二)--Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能 我的本意是第二篇写Mob的shareSD ...

  3. android 加载三方so的方法_Android开发教程之动态加载so库文件的方法

    Android开发教程之动态加载so库文件的方法,我想对于静态加载 so 库文件,大家都已经很熟悉了,这里就不多说了.在 Android 开发中调用动态库文件(*.so)都是通过 jni 的方式,而静 ...

  4. 【Android开发那点破事】打开APP加载页面实现

    今天的破事呢就说说APP加载页面的实现.一般情况下,当APP打开的时候,我们需要做很多事情,比如检查网络连接啊,初始化一些配置啊等等.我们可以让这些事情在APP完全打开之前做完,然后呢在打开的过程中显 ...

  5. android 双 webview,Android webview加载页面

    释放双眼,带上耳机,听听看~! Android webview加载页面 private WebView webView; public void init() { webView = (WebView ...

  6. android-ultra-pull-to-refresh list,[Android]Ultra-Pull-To-Refresh之listview下拉刷新、上拉加载的用例...

    前言 app中最常见的场景莫过于下拉刷新和自动加载的功能了,最经典的开源组件就是 本次demo的编辑环境为android studio,java1.8 截图 使用 1.本示例依赖jar如下: depe ...

  7. Android每日源码,微博编辑框ProgressDialog加载“到位”功能流动布局快递小说app

    1.支持类似微博的编辑框,可输入表情和@某人 2.自定义ProgressDialog加载提醒 3.快速开发偷懒必备(二) 支持DataBinding啦~爽炸,花式列表一... 4.利用百度地图快速实现 ...

  8. Android每日源码,微博编辑框ProgressDialog加载“到位”功能流动布局快递小说app...

    1.支持类似微博的编辑框,可输入表情和@某人 支持类似微博的编辑框,可输入表情和@某人 2.自定义ProgressDialog加载提醒 自定义ProgressDialog加载提醒 3.快速开发偷懒必备 ...

  9. android 海浪动画,android自定义波浪加载动画的实现代码

    本文实例为大家分享了android自定义波浪加载动画的具体代码,供大家参考,具体内容如下 效果图 1.自定义控件 WaveView package com.example.wh.myapplicati ...

最新文章

  1. 【网络流24题】D、魔术球问题(有向无环图的最小路径覆盖、思维)
  2. Objective-C中的内存管理
  3. 图解Win7下安装Oracle 12c
  4. 定理在数学中的简写形式_西方把勾股定理叫毕达哥拉斯定理,我们的教材上是不是该改改名?...
  5. 如何种植屡获殊荣的青豆
  6. 《Python Cookbook 3rd》笔记(3.13):计算最后一个周五的日期
  7. C++学习——static
  8. 论优秀的码农,学会这5点!
  9. spine纹理解包 黑底_“包治百病”是真理,这些小众包真的很治愈系
  10. maven 安装后变成 mvn 不是内部命令解决方法
  11. 7-Arco大讲堂(二)
  12. Kibana:Heatmap 可视化介绍及 how-to
  13. 2020第三届中青杯问题总结
  14. SAT写作例子之Frank Lloyd Wright
  15. GEO数据挖掘(学习笔记)
  16. VB对象的事件和方法
  17. Python使用在线接口SDK模块(baidu-aip)实现人脸识别
  18. 人工智能写作的春天来了 除了写作, 人工智能还能写诗、画画
  19. 各种文件对应的文件类型
  20. 顶点计划:996问题讨论

热门文章

  1. 【C51单片机】PC机控制单片机
  2. 3D打印机故障问题与解决总集
  3. IEEE754浮点数格式详解
  4. 类模板中的友元,友元类
  5. List(updated 2023.01.29)
  6. 网络设备配置与管理-综合实验2
  7. 智能风控平台之决策引擎介绍
  8. linux6查看用户密码,linux如何查看所有的用户(user)、用户组(group)、密码(password/passwd)...
  9. 项目经理需要掌握的硬技能和软技能
  10. java使用es查询