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

在项目中,都会用到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;
  }

 }
}

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

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

(0)

相关推荐

  • Android编程使用ListView实现数据列表显示的方法

    本文实例讲述了Android编程使用ListView实现数据列表显示的方法.分享给大家供大家参考,具体如下: 要将数据库中的数据列表显示在屏幕上,我们要使用ListView这个控件,当用户从数据库中取出数据时,要将数据绑定到显示控件上,如何绑定呢,我们需要创建适配器进行绑定,创建适配器有两种方式: 第一种是用SimpleAdapter创建(要求绑定的数据是List<HashMap<String, Object>>数据类型) 第二种是用SimpleCursorAdapter创建(要求

  • Android中ListView结合CheckBox实现数据批量选择(全选、反选、全不选)

    APP的开发中,会常遇到这样的需求:批量取消(删除)List中的数据.这就要求ListVIew支持批量选择.全选.单选等等功能,做一个比较强大的ListView批量选择功能是很有必要的,那如何做呢? 可想而知,要支持批量选择,那CheckBox的使用是不可或缺的,下面,就使用ListView结合CheckBox实现数据的批量选择. 先看下效果图,有图有真相: 先说明接下来要实现的ListView+CheckBox支持的功能:     1.  外部点击"编辑"(长按ListView的某一

  • java 查找list中重复数据实例详解

    java 查找list中重复数据实例详解 需求: 查找一个List集合中所有重复的数据,重复的数据可能不止一堆,比如:aa, bb, aa, bb, cc , dd, aa这样的数据.如果有重复数据,则给这些重复数据加上编号,上述数据改为:aa1, bb1, aa2, bb2, cc, dd. 算法如下: public static void same(List<String> list) { String [] indexArr ; Map<String, String> map

  • Android实现ListView分页自动加载数据的方法

    Android应用开发中,采用ListView组件来展示数据是很常用的功能,当一个应用要展现很多的数据时,一般情况下都不会把所有的数据一次就展示出来,而是通过分页的形式来展示数据,个人觉得这样会有更好的用户体验.因此,很多应用都是采用分批次加载的形式来获取用户所需的数据.例如:微博客户端可能会在用户滑动至列表底端时自动加载下一页数据,也可能在底部放置一个"查看更多"按钮,用户点击后,加载下一页数据. 下面通过一个Demo来展示ListView功能如何实现:该Demo通过在ListVie

  • Android操作SQLite数据库(增、删、改、查、分页等)及ListView显示数据的方法详解

    本文实例讲述了Android操作SQLite数据库(增.删.改.查.分页等)及ListView显示数据的方法.分享给大家供大家参考,具体如下: 由于刚接触android开发,故此想把学到的基础知识记录一下,以备查询,故此写的比较啰嗦: 步骤如下: 一.介绍: 此文主要是介绍怎么使用android自带的数据库SQLite,以及把后台的数据用ListView控件显示 二.新建一个android工程--DBSQLiteOperate 工程目录: 三.清单列表AndroidManifest.xml的配置

  • Android List删除重复数据

    1.通过循环进行删除 public static void removeDuplicate(List list) { for ( int i = 0 ; i < list.size() - 1 ; i ++ ) { for ( int j = list.size() - 1 ; j > i; j -- ) { if (list.get(j).equals(list.get(i))) { list.remove(j); } } } System.out.println(list); } 2.通过

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

    在项目中,都会用到ListView或GridView等列表控件.一般会用来展示从网络请求的数据 .如果请求的数据为空或者在请求的时候正好无没有网络了,我们的界面应该如何展示呢?数据为空的时候,ListView可以使用setEmptyView (View emptyView) 方法来我们需要的统一界面.数据加载失败呢?我们也可以统一进行处理. //下面这个类是简单地封装用于无数据及加载错误的一个页面. public class CommonShowView { private Context mC

  • Android编程实现压缩图片并加载显示的方法

    本文实例讲述了Android编程实现压缩图片并加载显示的方法.分享给大家供大家参考,具体如下: 解析: 图片压缩的关键就是 options.inSampleSize = scale; 如果scale > 0,表示图片进行了压缩 /** * 压缩图片 * @author chen.lin * */ public class LoadImageActivity extends Activity implements OnClickListener { private Button mBtnLoad;

  • js/jquery控制页面动态加载数据 滑动滚动条自动加载事件的方法

    页面滚动动态加载数据,页面下拉自动加载内容 相信很多人都见过瀑布流图片布局,那些图片是动态加载出来的,效果很好,对服务器的压力相对来说也小了很多 有手机的相信都见过这样的效果:进入qq空间,向下拉动空间,到底部时,会动态加载剩余的说说或者是日志 今天我们就来看看他们的实现思路和js控制动态加载的代码 下面的代码主要是控制滚动条下拉时的加载事件的 在下面代码说明出,写上你的操作即可,无论是加载图片还是加载记录数据  都可以 别忘了引用jquery类库 $(window).scroll(functi

  • Android ListView滚动到底后自动加载数据

    熟悉Android的朋友们都知道,不管是微博客户端还是新闻客户端,都离不开列表组件,可以说列表组件是Android数据展现方面最重要的组件,我们 今天就要讲一讲列表组件ListView加载数据的相关内容.通常来说,一个应用在展现大量数据时,不会将全部的可用数据都呈现给用户,因为这不管对于服 务端还是客户端来说都是不小的压力,因此,很多应用都是采用分批次加载的形式来获取用户所需的数据.比如:微博客户端可能会在用户滑动至列表底端时自动加 载下一页数据,也可能在底部放置一个"加载更多"按钮,

  • jQuery实现滚动到底部时自动加载更多的方法示例

    本文实例讲述了jQuery实现滚动到底部时自动加载更多的方法.分享给大家供大家参考,具体如下: 这里利用AJAX,实现滚动到底加载数据功能: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/

  • 解决JSON数据因为null导致数据加载失败的方法

    一.首先分析问题: 使用NSJSONSerialization或者AFN框架的AFHTTPSessionManager(底层也是NSJSONSerialization)将NSData数据转化成OC对象,有时会出现URL正确,加载数据任然会报错: reason: '-[NSNull length]: unrecognized selector sent to instance 分析原因发现,转化出来的OC对象中含有null.所以,NSNull没有length方法,所以会报找不到方法错误. 二.解决

  • Android实现ListView异步加载图片的方法

    本文实例讲述了Android实现ListView异步加载图片的方法.分享给大家供大家参考.具体如下: ListView异步加载图片是非常实用的方法,凡是是要通过网络获取图片资源一般使用这种方法比较好,用户体验好,不用让用户等待下去,下面就说实现方法,先贴上主方法的代码: package cn.wangmeng.test; import java.io.IOException; import java.io.InputStream; import java.lang.ref.SoftReferen

  • Android自定义listview布局实现上拉加载下拉刷新功能

    listview实现上拉加载以及下拉刷新的方式有很多.下面是我写的一种自定义的布局,复用性也比较的强.首先就是继承的listview的自定义view.   AutoListView.Java: package com.example.mic.testdemo.view; import android.annotation.TargetApi; import android.content.Context; import android.os.Build; import android.os.Bu

  • Android ListView数据的分批显示功能

    Android ListView数据的分批显示 布局文件activity_call_safe2.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" androi

  • Android基于ListView实现类似Market分页加载效果示例

    本文实例讲述了Android基于ListView实现类似Market分页加载效果.分享给大家供大家参考,具体如下: 最近几天研究ListView实现分页加载和滚动加载,发现可以用listView的OnScroll方法来实现,直接上代码 ListViewScroll.java package zy.lucifer.ListViewScroll; import android.app.Activity; import android.os.Bundle; import android.util.Lo

随机推荐