给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. .Net中的AOP系列之构建一个汽车租赁应用

    返回<.Net中的AOP>系列学习总目录 本篇目录 开始一个新项目 没有AOP的生活 变更的代价 使用AOP重构 本系列的源码本人已托管于Coding上:点击查看. 本系列的实验环境:VS ...

  2. SSH实战 · 唯唯乐购项目(下)

    后台模块 一:后台用户模块 引入后台管理页面 创建adminuser表: CREATE TABLE `adminuser` (   `uid` int(11) NOT NULL AUTO_INCREM ...

  3. 以bank account 数据为例,认识elasticsearch query 和 filter

    Elasticsearch 查询语言(Query DSL)认识(一) 一.基本认识 查询子句的行为取决于 query context filter context 也就是执行的是查询(query)还是 ...

  4. JavaScript Math和Number对象

    目录 1. Math 对象:数学对象,提供对数据的数学计算.如:获取绝对值.向上取整等.无构造函数,无法被初始化,只提供静态属性和方法. 2. Number 对象 :Js中提供数字的对象.包含整数.浮 ...

  5. JQuery 选择器

    选择器是JQuery的根基,在JQuery中,对事件的处理,遍历DOM和AJAX操作都依赖于选择器.如果能够熟练地使用选择器,不仅能简化代码,而且还可以事半功倍. JQuery选择器的优势 1.简洁的 ...

  6. 界面设计技法之css布局

    css布局之于页面就如同ECMAScript之于JS一般,细想一番,html就如同语文,css就如同数学,js呢,就是物理,有些扯远,这里就先不展开了. 回到主题,从最开始的css到如今的sass(l ...

  7. asp.net mvc 验证码

    效果图 验证码类 namespace QJW.VerifyCode { //用法: //public FileContentResult CreateValidate() //{ // Validat ...

  8. C++的内存泄漏检测【转载】

    原文地址: http://www.cnblogs.com/jily/p/6239514.html

  9. RabbitMQ + PHP (二)AMQP拓展安装

    上篇说到了 RabbitMQ 的安装. 这次要在讲案例之前,需要安装PHP的AMQP扩展.不然可能会报以下两个错误. 1.Fatal error: Class 'AMQPConnection' not ...

  10. iOS开源项目周报1215

    由OpenDigg 出品的iOS开源项目周报第一期来啦.我们的iOS开源周报集合了OpenDigg一周来新收录的优质的iOS开发方面的开源项目,方便iOS开发人员便捷的找到自己需要的项目工具等. PY ...