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

解决Android ListView数据为空及加载错误的方法

程序员文章站 2024-02-24 22:29:34
在项目中,都会用到listview或gridview等列表控件。一般会用来展示从网络请求的数据 。如果请求的数据为空或者在请求的时候正好无没有网络了,我们的界面应该如何展示...

在项目中,都会用到listview或gridview等列表控件。一般会用来展示从网络请求的数据 。如果请求的数据为空或者在请求的时候正好无没有网络了,我们的界面应该如何展示呢?数据为空的时候,listview可以使用setemptyview (view emptyview) 方法来我们需要的统一界面。数据加载失败呢?我们也可以统一进行处理。

//下面这个类是简单地封装用于无数据及加载错误的一个页面。
public class commonshowview {

 private context mcontext;// 上下文
 private viewgroup memptyorerrorview;// 页面加载无数据或加载错误时显示
 private viewgroup mcontentview;// 加载成功时显示的内容
 private viewgroup mparentview;// 父布局viewgroup
 private layoutinflater minflater;
 private textview no_net;
 private button load_btn;
 private boolean mviewsadded;
 private viewgroup.layoutparams mlayoutparams = new viewgroup.layoutparams(layoutparams.match_parent, layoutparams.match_parent);
 public final static int type_empty = 1;// 数据为空
 public final static int type_error = 2;// 加载数据失败
 public final static int type_content = 3;// 直接显示内容
 private int mtype = type_empty;// 数据类型,默认是无数据

 /**
  * 构造方法,传入上下文及内容groupview
  */
 public commonshowview(context context, viewgroup mcontentview) {
  mcontext = context;
  minflater = layoutinflater.from(mcontext);
  this.mcontentview = mcontentview;
  mparentview = (viewgroup) mcontentview.getparent();
  initviews();
 }

 @suppresslint("inflateparams")
 private void initviews() {
  memptyorerrorview = (viewgroup) minflater.inflate(r.layout.common_show, null);
  no_net = (textview) memptyorerrorview.findviewbyid(r.id.no_net);
  load_btn = (button) memptyorerrorview.findviewbyid(r.id.load_btn);
  if (!mviewsadded) {
   mviewsadded = true;
   mparentview.addview(memptyorerrorview, mlayoutparams);
  }

  load_btn.setonclicklistener(new onclicklistener() {// 检查网络,进行网络设置

   @override
   public void onclick(view v) {
    intent intent = null;
    // 判断手机系统的版本 即api大于10 就是3.0或以上版本及魅族手机
    if (android.os.build.version.sdk_int > 10 && !android.os.build.manufacturer.equals("meizu")) {
     intent = new intent(android.provider.settings.action_wireless_settings);
    }
    else if (android.os.build.version.sdk_int > 17 && android.os.build.manufacturer.equals("meizu")) {
     intent = new intent(android.provider.settings.action_settings);
    }
    else {
     intent = new intent();
     componentname component = new componentname("com.android.settings", "com.android.settings.wirelesssettings");
     intent.setcomponent(component);
     intent.setaction("android.intent.action.view");
    }
    mcontext.startactivity(intent);

   }
  });
 }

 public viewgroup getemptyorerrorview() {
  return memptyorerrorview;
 }

 /**
  * 设置无数据或加载错误view
  * @description:
  */
 public void setemptyorerrorview(viewgroup emptyorerrorview) {
  this.mparentview.removeview(this.memptyorerrorview);
  this.mparentview.addview(emptyorerrorview, mlayoutparams);
  this.memptyorerrorview = emptyorerrorview;
 }

 /**
  * 设置无数据或加载错误view
  * @description:
  */
 public void setemptyorerrorview(int res) {
  viewgroup vg = (viewgroup) minflater.inflate(res, null);
  this.mparentview.removeview(this.memptyorerrorview);
  this.mparentview.addview(vg, mlayoutparams);
  this.memptyorerrorview = vg;
 }

 /**
  * 获取内容view
  * @description:
  */
 public viewgroup getcontextview() {
  return mcontentview;
 }

 /**
  * 方法概述:获取内容view的父布局
  */
 public viewgroup getrootview() {
  return mparentview;
 }

 /**
  * 方法概述:设置展示内容的视图
  */
 public void setcontextview(viewgroup contentview) {
  this.mtype = type_content;
  showbytype(mtype);
 }

 /**
  * 根据类型进行对应展示 
  * @description:
  * @date 2016-2-19 下午3:02:20
  */
 public void showbytype(int mtype) {
  hideallviews();
  if (mcontentview != null) {
   switch (mtype) {
    case type_empty:

     if (memptyorerrorview != null) {
      memptyorerrorview.setvisibility(view.visible);
      no_net.settext("这里空空也野哦~");
      load_btn.setvisibility(view.gone);
     }
     break;
    case type_error:
     if (memptyorerrorview != null) {
      memptyorerrorview.setvisibility(view.visible);
      no_net.settext("网络加载失败哦~");
      load_btn.setvisibility(view.visible);
     }
     break;
    case type_content:
     if (mcontentview != null) {
      mcontentview.setvisibility(view.visible);
     }
     break;
    default:
     break;
   }
  }
 }

 /**
  * 方法概述:将所有的子view隐藏起来
  */
 private void hideallviews() {
  if (mparentview != null) {
   if (mparentview.getchildcount() > 0) {
    for (int i = 0; i < mparentview.getchildcount(); i++) {
     view childview = mparentview.getchildat(i);
     if (childview != null) {
      childview.setvisibility(view.gone);
     }
    }
   }
  }

 }
}
//错误页面及空页面时布局
<?xml version="1.0" encoding="utf-8"?>
<relativelayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/rel_null"
 android:layout_width="match_parent"
 android:layout_height="match_parent" >

 <textview
  android:id="@+id/no_net"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_centerhorizontal="true"
  android:layout_centerinparent="true"
  android:gravity="center"
  android:text="好像没网哦~"
  android:textcolor="#333333"
  android:textsize="16sp" />

 <button
  android:id="@+id/load_btn"
  android:layout_width="112dp"
  android:layout_height="40dp"
  android:layout_below="@+id/no_net"
  android:layout_centerhorizontal="true"
  android:layout_margintop="15dp"
  android:background="#e12228"
  android:gravity="center"
  android:text="检查网络"
  android:textcolor="#ffffff"
  android:textsize="14sp" />

</relativelayout>
//在activity中使用
public class mainactivity extends activity {
 private listview listview;
 private commonshowview mshowview;
 private list<string> datas;

 @override
 protected void oncreate(bundle savedinstancestate) {
  super.oncreate(savedinstancestate);
  setcontentview(r.layout.activity_main);
  listview = (listview) findviewbyid(r.id.listview);
  mshowview = new commonshowview(this, listview);
  // ----------有数据的时情况下--------------
  // datas = getdatas(true);
  // listview.setadapter(new myadapter(this, datas));
  // mshowview.setcontextview(listview);//显示数据,也可以不调用,直接显示
  // --------无数据的情况下----------------
  // datas = getdatas(false);//无数据
  // mshowview.showbytype(commonshowview.type_empty);
  // ---------数据加载失败的情况下---------------
  mshowview.showbytype(commonshowview.type_error);
 }

 private list<string> getdatas(boolean flag) {
  list<string> datas = new arraylist<>();
  datas.add("这是第一行的data");
  datas.add("这是第2行的data");
  datas.add("这是第三行的data");
  datas.add("这是第4行的data");
  if (flag) {
   return datas;
  }
  else {
   return null;
  }
 }

 class myadapter extends baseadapter {
  private list<string> datas;
  private context mcontext;

  public myadapter(context mcontext, list<string> datas) {
   this.mcontext = mcontext;
   this.datas = datas;
  }

  @override
  public int getcount() {
   // todo auto-generated method stub
   return datas.size();
  }

  @override
  public object getitem(int position) {
   // todo auto-generated method stub
   return datas.get(position);
  }

  @override
  public long getitemid(int position) {
   // todo auto-generated method stub
   return position;
  }

  @override
  public view getview(int position, view convertview, viewgroup parent) {
   // 这里只举个小例子,没有考虑性能 优化
   textview tv = new textview(mcontext);
   tv.settextsize(16f);
   tv.settext(datas.get(position));
   return tv;
  }

 }
}

目前只是做了个超级简单的样式,具体的展示根据需求再改再封装。帖个图:

解决Android ListView数据为空及加载错误的方法解决Android ListView数据为空及加载错误的方法

以上就是listview数据为空及加载错误处理的方法,希望对大家的学习有所帮助。