给ListView设置emptyView

版权声明:本文为博主原创文章,未经博主允许不得转载。

使用ListView和GridView时,当列表为空时,默认是不显示任何内容的,这样对用户非常不友好,这时我们就需要通过setEmptyView(View emptyView)来设置当列表为空时的提示。

emptyView简单使用Demo

下面展示emptyView使用的简单Demo。

activity_empty_list_view.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.littlejie.listview.EmptyListViewActivity"> <ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="wrap_content"></ListView> <!-- ListView的emptyView,默认不需设置其visiblity属性设置为GONE -->
<!-- 当ListView为空时,emptyView会自动被设置为GONE -->
<!-- 当ListView不为空时,emptyView会自动被设置为VIBISIBLE -->
<LinearLayout
android:id="@android:id/empty"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:text="Empty" /> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:text="EmptyView可以是ViewGroup" />
</LinearLayout> </LinearLayout>

EmptyListViewActivity.java:

public class EmptyListViewActivity extends Activity {

    private ListView mLv;

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_empty_list_view); mLv = (ListView) findViewById(R.id.lv);
mLv.setAdapter(new ArrayAdapter<>(this,
android.R.layout.simple_list_item_1, generateString(0)));
mLv.setEmptyView(findViewById(android.R.id.empty));
} private List<String> generateString(int num) {
List<String> list = new ArrayList<>();
for (int i = 0; i < num; i++) {
list.add("item " + i);
}
return list;
} }

运行结果如下:

emptyView复杂使用Demo

前一个Demo讲了emptyView的简单使用方法,那如果我们要自定义emptyView或者emptyView的布局跟ListView不在同一个布局文件中呢?恩,你可能会说:直接调用setEmptyView(View emptyView)不行嘛,难道有啥不一样?
看来,你还是too young too simple。直接调用的结果就是:emptyView根本就不会显示!!!
新建一个ComplexEmptyListViewActivity.java:

public class ComplexEmptyListViewActivity extends Activity {

    private ListView mLv;
private EmptyView mEmptyView; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_complex_empty_list_view); mLv = (ListView) findViewById(R.id.lv);
mLv.setAdapter(new ArrayAdapter<>(this,
android.R.layout.simple_list_item_1, Utils.generateString(0))); mEmptyView = new EmptyView(this);
//此处是重点,如果不将mEmptyView添加进当前的ViewGroup,mEmptyView都不可见
//((ViewGroup) mLv.getParent()).addView(mEmptyView);
mLv.setEmptyView(mEmptyView);
}
}

布局文件activity_complex_empty_list_view.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.littlejie.listview.EmptyListViewActivity"> <ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="wrap_content"></ListView> </LinearLayout>

EmptyView:

public class EmptyView extends LinearLayout {

    public EmptyView(Context context) {
super(context);
init(context);
} public EmptyView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
} private void init(Context context) {
View view = LayoutInflater.from(context).inflate(R.layout.complex_empty_view, this);
}
}

complex_empty_view.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"> <TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="假装我是复杂的emptyView" /> </LinearLayout>

运行demo,你会发现ListView为空时,根本就没显示emptyView。这是为什么呢?因为emptyView根本就没添加到当前Activity的布局中,所以即使设置了emptyView也不会显示,解决方法就是把emptyView添加到当前Activity的布局中(ComplexEmptyListViewActivity注释的内容)

补充

  1. 细心的可能已经发现,在两个demo中,我们都没去设置emptyView的visiblity属性,这是为什么呢?其实看下源码就知道了~

    当调用setEmptyView(View emptyView)方法时,ListView会调用到updateEmptyStatus(boolean empty),在这里系统会跟empty去判断是否显示emptyView。恩,就这么简单~

    /**
    * Sets the view to show if the adapter is empty
    */
    @android.view.RemotableViewMethod
    public void setEmptyView(View emptyView) {
    mEmptyView = emptyView; // If not explicitly specified this view is important for accessibility.
    if (emptyView != null
    && emptyView.getImportantForAccessibility() == IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
    emptyView.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES);
    } final T adapter = getAdapter();
    final boolean empty = ((adapter == null) || adapter.isEmpty());
    updateEmptyStatus(empty);
    } /**
    * Update the status of the list based on the empty parameter. If empty is true and
    * we have an empty view, display it. In all the other cases, make sure that the listview
    * is VISIBLE and that the empty view is GONE (if it's not null).
    */
    private void updateEmptyStatus(boolean empty) {
    if (isInFilterMode()) {
    empty = false;
    } if (empty) {
    if (mEmptyView != null) {
    mEmptyView.setVisibility(View.VISIBLE);
    setVisibility(View.GONE);
    } else {
    // If the caller just removed our empty view, make sure the list view is visible
    setVisibility(View.VISIBLE);
    } // We are now GONE, so pending layouts will not be dispatched.
    // Force one here to make sure that the state of the list matches
    // the state of the adapter.
    if (mDataChanged) {
    this.onLayout(false, mLeft, mTop, mRight, mBottom);
    }
    } else {
    if (mEmptyView != null) mEmptyView.setVisibility(View.GONE);
    setVisibility(View.VISIBLE);
    }
    }

给ListView设置emptyView的更多相关文章

  1. android: ListView设置emptyView 误区

    使用ListVIew 来设置EmptyView的时候须注意: ListView listview = (ListView) findViewById(R.id.list); View emptyVie ...

  2. ListView之EmptyView

    From:http://blog.csdn.net/xiangqiao123/article/details/17994099 继承ListActivity比较方便 最新开发一个应用程序,需要用到当L ...

  3. 在为ListView设置adapter时出错

    为listView设置adapter,代码如下: SimpleAdapter simpleAdapter = new SimpleAdapter(this, listItems, R.layout.m ...

  4. 【转】三十三、Android给ListView设置分割线Divider样式

    原文网址:http://www.cnblogs.com/linjiqin/archive/2011/11/12/2246349.html 给ListView设置分割线,只需设置如下两个属性: andr ...

  5. Android给ListView设置分割线Divider样式

    给ListView设置分割线,只需设置如下两个属性: android:divider="#000" //设置分割线显示颜色 android:dividerHeight=" ...

  6. Android ListView 设置单选

    为 ListView 设置选中状态,需要经过如下几个步骤: 设置 ListView 的 android:choiceMode="singleChoice" 设置 ListView ...

  7. WPF,ListView设置分组

    原文:WPF,ListView设置分组 今天遇到一个问题,就是在ListView中设置分组.想了很久在网上早了些资料作出一个例子. 分组字段也可以在后台中定义: CollectionView view ...

  8. Android开发之ListView设置隔行变色

    public class HLCheckAdapter extends BaseAdapter { private List<HuoLiang> list; private Context ...

  9. Android下用程序的方法为ListView设置分割线Divider样式

    使用XML的时候可以使用android:divider属性为ListView设置分割线的样式(颜色或者资源文件),而在Java代码中默认提供的方法 listView.setDivider() 却只支持 ...

随机推荐

  1. Unity3d学习 制作地形

    这周学习了如何在unity中制作地形,就是在一个Terrain的对象上盖几座小山,在山底种几棵树,那就讲一下如何完成上述内容. 1.在新键得项目的游戏的Hierarchy目录中新键一个Terrain对 ...

  2. HTTP协议系列(1)

    一.为什么学习Http协议       首先明白我们为什么学习HTTP协议,也就是说明白HTTP协议的作用.HTTP协议是用于客户端与服务器之间的通讯.明白了HTTP协议的作用也就知道了为什么要学习H ...

  3. C语言 · 奇偶判断

    问题描述 能被2整除的数称为偶数,不能被2整除的数称为奇数.给一个整数x,判断x是奇数还是偶数. 输入格式 输入包括一个整数x,0<=x<=100000000. 输出格式 如果x是奇数,则 ...

  4. JavaScript function函数种类

    本篇主要介绍普通函数.匿名函数.闭包函数 目录 1. 普通函数:介绍普通函数的特性:同名覆盖.arguments对象.默认返回值等. 2. 匿名函数:介绍匿名函数的特性:变量匿名函数.无名称匿名函数. ...

  5. ExtJS 4.2 介绍

    本篇介绍ExtJS相关知识,是以ExtJS4.2.1版本为基础进行说明,包括:ExtJS的特点.MVC模式.4.2.1GPL版本资源的下载和说明以及4种主题的演示. 目录 1. 介绍 1.1 说明 1 ...

  6. .Net Core MVC 网站开发(Ninesky) 2.3、项目架构调整(续)-使用配置文件动态注入

    上次实现了依赖注入,但是web项目必须要引用业务逻辑层和数据存储层的实现,项目解耦并不完全:另一方面,要同时注入业务逻辑层和数据访问层,注入的服务直接写在Startup中显得非常臃肿.理想的方式是,w ...

  7. 前端学HTTP之Web主机托管

    前面的话 对内容资源的存储.协调以及管理的职责统称为Web主机托管.主机托管是Web服务器的主要功能之一.保存并提供内容,记录对内容的访问以及管理内容都离不开服务器.如果不想自行管理服务器所需的软硬件 ...

  8. ASP.NET MVC5+EF6+EasyUI 后台管理系统(71)-微信公众平台开发-公众号管理

    系列目录 思维导图 下面我们来看一个思维导图,这样就可以更快了解所需要的功能: 上一节我们利用了一个简单的代码例子,完成了与微信公众号的对话(给公众号发一条信息,并得到回复) 这一节将讲解公众号如何设 ...

  9. 设计模式之创建类模式大PK

                                        创建类模式大PK 创建类模式包括工厂方法模式.建造者模式.抽象工厂模式.单例模式和原型模式,他们能够提供对象的创建和管理职责.其 ...

  10. 原生JavaScript实现hasClass、addClass、removeClass、toggleClass

    兼容IE6+,因IE6.IE7.IE8不支持Array.prototype.indexOf()和String.prototype.trim(),分别用Polyfill实现支持. 详细: indexOf ...