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

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

001 //下面这个类是简单地封装用于无数据及加载错误的一个页面。
002 public class CommonShowView {
003  
004  private Context mContext;// 上下文
005  private ViewGroup mEmptyOrErrorView;// 页面加载无数据或加载错误时显示
006  private ViewGroup mContentView;// 加载成功时显示的内容
007  private ViewGroup mParentView;// 父布局viewGroup
008  private LayoutInflater mInflater;
009  private TextView no_net;
010  private Button load_btn;
011  private boolean mViewsAdded;
012  private ViewGroup.LayoutParams mLayoutParams = new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
013  public final static int TYPE_EMPTY = 1;// 数据为空
014  public final static int TYPE_ERROR = 2;// 加载数据失败
015  public final static int TYPE_CONTENT = 3;// 直接显示内容
016  private int mType = TYPE_EMPTY;// 数据类型,默认是无数据
017  
018  /**
019   * 构造方法,传入上下文及内容GroupView
020   */
021  public CommonShowView(Context context, ViewGroup mContentView) {
022   mContext = context;
023   mInflater = LayoutInflater.from(mContext);
024   this.mContentView = mContentView;
025   mParentView = (ViewGroup) mContentView.getParent();
026   initViews();
027  }
028  
029  @SuppressLint("InflateParams")
030  private void initViews() {
031   mEmptyOrErrorView = (ViewGroup) mInflater.inflate(R.layout.common_show, null);
032   no_net = (TextView) mEmptyOrErrorView.findViewById(R.id.no_net);
033   load_btn = (Button) mEmptyOrErrorView.findViewById(R.id.load_btn);
034   if (!mViewsAdded) {
035    mViewsAdded = true;
036    mParentView.addView(mEmptyOrErrorView, mLayoutParams);
037   }
038  
039   load_btn.setOnClickListener(new OnClickListener() {// 检查网络,进行网络设置
040  
041    @Override
042    public void onClick(View v) {
043     Intent intent = null;
044     // 判断手机系统的版本 即API大于10 就是3.0或以上版本及魅族手机
045     if (android.os.Build.VERSION.SDK_INT > 10 && !android.os.Build.MANUFACTURER.equals("Meizu")) {
046      intent = new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS);
047     }
048     else if (android.os.Build.VERSION.SDK_INT > 17 && android.os.Build.MANUFACTURER.equals("Meizu")) {
049      intent = new Intent(android.provider.Settings.ACTION_SETTINGS);
050     }
051     else {
052      intent = new Intent();
053      ComponentName component = new ComponentName("com.android.settings""com.android.settings.WirelessSettings");
054      intent.setComponent(component);
055      intent.setAction("android.intent.action.VIEW");
056     }
057     mContext.startActivity(intent);
058  
059    }
060   });
061  }
062  
063  public ViewGroup getEmptyOrErrorView() {
064   return mEmptyOrErrorView;
065  }
066  
067  /**
068   * 设置无数据或加载错误view
069   * @description:
070   */
071  public void setEmptyOrErrorView(ViewGroup emptyOrErrorView) {
072   this.mParentView.removeView(this.mEmptyOrErrorView);
073   this.mParentView.addView(emptyOrErrorView, mLayoutParams);
074   this.mEmptyOrErrorView = emptyOrErrorView;
075  }
076  
077  /**
078   * 设置无数据或加载错误view
079   * @description:
080   */
081  public void setEmptyOrErrorView(int res) {
082   ViewGroup vg = (ViewGroup) mInflater.inflate(res, null);
083   this.mParentView.removeView(this.mEmptyOrErrorView);
084   this.mParentView.addView(vg, mLayoutParams);
085   this.mEmptyOrErrorView = vg;
086  }
087  
088  /**
089   * 获取内容view
090   * @description:
091   */
092  public ViewGroup getContextView() {
093   return mContentView;
094  }
095  
096  /**
097   * 方法概述:获取内容View的父布局
098   */
099  public ViewGroup getRootView() {
100   return mParentView;
101  }
102  
103  /**
104   * 方法概述:设置展示内容的视图
105   */
106  public void setContextView(ViewGroup contentView) {
107   this.mType = TYPE_CONTENT;
108   showByType(mType);
109  }
110  
111  /**
112   * 根据类型进行对应展示
113   * @description:
114   * @date 2016-2-19 下午3:02:20
115   */
116  public void showByType(int mType) {
117   hideAllViews();
118   if (mContentView != null) {
119    switch (mType) {
120     case TYPE_EMPTY:
121  
122      if (mEmptyOrErrorView != null) {
123       mEmptyOrErrorView.setVisibility(View.VISIBLE);
124       no_net.setText("这里空空也野哦~");
125       load_btn.setVisibility(View.GONE);
126      }
127      break;
128     case TYPE_ERROR:
129      if (mEmptyOrErrorView != null) {
130       mEmptyOrErrorView.setVisibility(View.VISIBLE);
131       no_net.setText("网络加载失败哦~");
132       load_btn.setVisibility(View.VISIBLE);
133      }
134      break;
135     case TYPE_CONTENT:
136      if (mContentView != null) {
137       mContentView.setVisibility(View.VISIBLE);
138      }
139      break;
140     default:
141      break;
142    }
143   }
144  }
145  
146  /**
147   * 方法概述:将所有的子View隐藏起来
148   */
149  private void hideAllViews() {
150   if (mParentView != null) {
151    if (mParentView.getChildCount() > 0) {
152     for (int i = 0; i < mParentView.getChildCount(); i++) {
153      View childView = mParentView.getChildAt(i);
154      if (childView != null) {
155       childView.setVisibility(View.GONE);
156      }
157     }
158    }
159   }
160  
161  }
162 }
01 //错误页面及空页面时布局
02 <?xml version="1.0" encoding="utf-8"?>
03 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
04  android:id="@+id/rel_null"
05  android:layout_width="match_parent"
06  android:layout_height="match_parent" >
07  
08  <TextView
09   android:id="@+id/no_net"
10   android:layout_width="match_parent"
11   android:layout_height="wrap_content"
12   android:layout_centerHorizontal="true"
13   android:layout_centerInParent="true"
14   android:gravity="center"
15   android:text="好像没网哦~"
16   android:textColor="#333333"
17   android:textSize="16sp" />
18  
19  <Button
20   android:id="@+id/load_btn"
21   android:layout_width="112dp"
22   android:layout_height="40dp"
23   android:layout_below="@+id/no_net"
24   android:layout_centerHorizontal="true"
25   android:layout_marginTop="15dp"
26   android:background="#E12228"
27   android:gravity="center"
28   android:text="检查网络"
29   android:textColor="#ffffff"
30   android:textSize="14sp" />
31  
32 </RelativeLayout>
01 //在Activity中使用
02 public class MainActivity extends Activity {
03  private ListView listview;
04  private CommonShowView mShowView;
05  private List<String> datas;
06  
07  @Override
08  protected void onCreate(Bundle savedInstanceState) {
09   super.onCreate(savedInstanceState);
10   setContentView(R.layout.activity_main);
11   listview = (ListView) findViewById(R.id.listview);
12   mShowView = new CommonShowView(this, listview);
13   // ----------有数据的时情况下--------------
14   // datas = getDatas(true);
15   // listview.setAdapter(new MyAdapter(this, datas));
16   // mShowView.setContextView(listview);//显示数据,也可以不调用,直接显示
17   // --------无数据的情况下----------------
18   // datas = getDatas(false);//无数据
19   // mShowView.showByType(CommonShowView.TYPE_EMPTY);
20   // ---------数据加载失败的情况下---------------
21   mShowView.showByType(CommonShowView.TYPE_ERROR);
22  }
23  
24  private List<String> getDatas(boolean flag) {
25   List<String> datas = new ArrayList<>();
26   datas.add("这是第一行的data");
27   datas.add("这是第2行的data");
28   datas.add("这是第三行的data");
29   datas.add("这是第4行的data");
30   if (flag) {
31    return datas;
32   }
33   else {
34    return null;
35   }
36  }
37  
38  class MyAdapter extends BaseAdapter {
39   private List<String> datas;
40   private Context mContext;
41  
42   public MyAdapter(Context mContext, List<String> datas) {
43    this.mContext = mContext;
44    this.datas = datas;
45   }
46  
47   @Override
48   public int getCount() {
49    // TODO Auto-generated method stub
50    return datas.size();
51   }
52  
53   @Override
54   public Object getItem(int position) {
55    // TODO Auto-generated method stub
56    return datas.get(position);
57   }
58  
59   @Override
60   public long getItemId(int position) {
61    // TODO Auto-generated method stub
62    return position;
63   }
64  
65   @Override
66   public View getView(int position, View convertView, ViewGroup parent) {
67    // 这里只举个小例子,没有考虑性能 优化
68    TextView tv = new TextView(mContext);
69    tv.setTextSize(16f);
70    tv.setText(datas.get(position));
71    return tv;
72   }
73  
74  }
75 }

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

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

posted @ 2017-04-25 11:15  天涯海角路  阅读(604)  评论(0)    收藏  举报