解决Android ListView数据为空及加载错误的方法
作者:BetterLaterThanNever 发布时间:2022-11-30 06:57:41
标签: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;
}
}
}
目前只是做了个超级简单的样式,具体的展示根据需求再改再封装。帖个图:


猜你喜欢
- https://www.jb51.net/article/191716.htm 此篇博文对flyway讲解的很清楚了,我在这只是稍
- 概述:利用AccessibilityService机制实现了一个比较好玩儿的功能,微信朋友圈自动遍历点赞。即通过不断的滚动+点赞实现把每一条
- Java 实现网络爬虫框架最近在做一个搜索相关的项目,需要爬取网络上的一些链接存储到索引库中,虽然有很多开源的强大的爬虫框架,但本着学习的态
- 一、简单介绍Unity 游戏实例开发集合,使用简单易懂的方式,讲解常见游戏的开发实现过程,方便后期类似游戏开发的借鉴和复用。本节介绍,Fly
- 引言之前写了一篇关于 TraceId 的文章:为全局请求添加 TraceId ,看日志再也不懵逼今天就接着 TraceId 做一些优化,如果
- spring boot RestTemplate 发送get请求踩坑闲话少说,代码说话RestTemplate 实例手动实例化,这个我基本不
- 说明:曾经在网上看过花样繁多的分页,很多都号称如何通用,但很多时候往往不尽如人意:有在分页类中还加入URL地址信息的,有在分页类中还进行分页
- 一、简介Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。Spring Cache提供
- 双亲委派模型类加载这个概念应该算是Java语言的一种创新,目的是为了将类的加载过程与虚拟机解耦,达到”通过类的全限定名来获取描述此类的二进制
- 写在前面:使用springboot作为web框架,方便开发许多,做分布式开发,dubbo又不可少,那么怎么整合在一起呢,跟我学一遍,至少会用
- 我们知道,当我们按返回或Home键退出应用程序的界面时,应用程序会在后台被挂起。这么设计的好处是,由于应用被系统缓存在内存中,那么在用户打开
- 由于Android课程项目需要,特地查阅了okHttp的使用,发现网上找的大多和自己的需求不一样。所以就着团队项目需要,自己简单封装了一个o
- 前文常用的控件介绍了不少,现在就来讨论一下手机开发中常用到的画图。要掌握Android的画图,首先就要了解一下,基本用到的如下一些图形接口:
- Unity 跑马灯抽奖效果实现代码,供大家参考,具体内容如下这边用到插件是NGUI+Dotween,思路简单说下:先排版,通过移动图片蒙版来
- Android6.0蓝牙出现无法扫描设备或闪退问题解决办法前言:目前待的这家公司是做智能家居的,最近客户那边有反馈说为什么我的手机蓝牙也打开
- 1. AIE (演示地址)AIE是一个开源的ajax图片编辑器,基于ExtJS与PHP ImageMagick开发,易于与博客/相册等其它应
- 用过ios的都知道ios上输入法关闭的同时会自动关闭输入框,那么在android上如何实现监听输入法弹出和关闭呢?本篇文章就为你提供了一种可
- OAuth 简介OAuth 是由 Blaine Cook、Chris Messina、Larry Halff 及 David Recordo
- 接上一篇写的截取电脑屏幕,我们在原来的基础上加一个选择区域的功能,实现自定义选择截图。个人比较懒,上一篇的代码就不重新设计了,就简单改一下呈
- 概述 Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,被称之为 Android 世界的Swift,由 JetBr