Android开发实现自定义新闻加载页面功能实例
程序员文章站
2023-12-15 19:30:58
本文实例讲述了android开发实现自定义新闻加载页面功能。分享给大家供大家参考,具体如下:
一、概述:
1、效果演示:
2、说明:在新闻页面刚加载的时候,一般会...
本文实例讲述了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 style="?android:attr/progressbarstylelarge" 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, 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<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程序设计有所帮助。