欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android开发实现自定义新闻加载页面功能实例

程序员文章站 2023-12-05 15:17:46
本文实例讲述了android开发实现自定义新闻加载页面功能。分享给大家供大家参考,具体如下: 一、概述: 1、效果演示: 2、说明:在新闻页面刚加载的时候,一般会...

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

一、概述:

1、效果演示:

Android开发实现自定义新闻加载页面功能实例

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程序设计有所帮助。