Android ListView无数据时显示其他View

今天看的一块布局是这样的:

 <!--
    The frame layout is here since we will be showing either
    the empty view or the list view.
    -->

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="0dip"
        android:layout_weight="1" >

        <!--
             Here is the list. Since we are using a ListActivity, we
             have to call it "@android:id/list" so ListActivity will
             find it
        -->

        <ListView
            android:id="@android:id/list"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:drawSelectorOnTop="false" />

        <!-- Here is the view to show if the list is emtpy -->

        <TextView
            android:id="@android:id/empty"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="No items."
            android:textAppearance="?android:attr/textAppearanceMedium" />
    </FrameLayout>

  这部分布局实际显示的效果却只有一个ListView,里面是数组的数据。

  于是,我很好奇这个TextView去了哪里,既然放在同一个FrameLayout中,它难道不是在上层挡着?

  显然,唯一没见过的就是这个TextView的id的属性设置:

           android:id="@android:id/empty"

  搜索了一下,原来这个属性值的作用就是,当ListView关联的Adapter中数据为空时,就显示这个TextView。

   而这个ListView中有数据显示时,这个TextView是不可见的。

 

使用场景1

  上面的布局是一个ListFragment所用的布局中的一块,同理,当Activity继承ListActivity时,可以直接实现。

  即,在布局中直接用id表达,不需要附加代码:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <!-- Here is the view to show if the list is emtpy -->

    <TextView
        android:id="@android:id/empty"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="No items." />

</FrameLayout>

 

 

package com.example.emptylist;

import android.os.Bundle;
import android.app.Activity;
import android.app.ListActivity;
import android.view.Menu;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MainActivity extends ListActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, generateStrings());

        setListAdapter(adapter);

    }

    private String[] generateStrings() {
        String[] strings = new String[0];

        for (int i = 0; i < strings.length; ++i) {
            strings[i] = "String " + i;
        }

        return strings;
    }

}

  这样当数组长度为0时,将自动显示TextView中的内容。而有数据时,显示ListView。

 

使用场景2

  如果选择不继承ListActivity,则上面例子中的TextView,即便id被设置为android:id="@android:id/empty",也不是只有ListView为空时才显示。

  事实上,因为在FrameLayout中,所以这个TextView会一直显示在ListView层之上。

  当ListView无数据时只显示TextView;但是ListView有数据时,仍然显示这个提示“No items”的TextView(which is obviously wrong!)。

  此时这个TextView的显示与否和ListView的数据没有什么关系了。

 

  对于不继承ListActivity的情况,要实现上面的效果应该如何呢?

  首先,ListView和TextView的id可以任意设置。

  然后,只需要调用在代码中调用setEmptyView(View emptyView)设置ListView为空时显示这个TextView即可。

  布局和代码如下:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ListView
        android:id="@+id/myList"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <!-- Here is the view to show if the list is emtpy -->

    <TextView
        android:id="@+id/myText"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="No items." />

</FrameLayout>

 

Activity:

package com.example.emptylist;

import android.os.Bundle;
import android.app.Activity;
import android.app.ListActivity;
import android.view.Menu;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MainActivity extends Activity {

    private ListView mListView = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mListView = (ListView) findViewById(R.id.myList);
        mListView.setEmptyView(findViewById(R.id.myText));

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, generateStrings());

        mListView.setAdapter(adapter);

    }

    private String[] generateStrings() {
        String[] strings = new String[100];

        for (int i = 0; i < strings.length; ++i) {
            strings[i] = "String " + i;
        }

        return strings;
    }

}

 

 

扩展:

  因为setEmptyView(View emptyView)这个方法是属于AdapterView这个类的,所以除了ListView之外,其他的子类,如GridView,Spinner等,应该也可以用这个方法来设置Adapter数据为空时显示另一个View。

时间: 2024-11-08 19:28:24

Android ListView无数据时显示其他View的相关文章

Android listview定位到上次显示的位置的实现方法

Android listview定位到上次显示的位置的实现方法 整体思路:滑动lictview时,记录listview的位置,定位时定位到该位置. 1.添加全局变量 private int scrolledX = 0; private int scrolledY = 0; 2.Oncreate()添加滚动事件监听 ClassesLV.setOnScrollListener(new OnScrollListener() { /** * 滚动状态改变时调用 */ @Override public v

Android的Fragment 进入时显示正在加载

问题描述 Android的Fragment 进入时显示正在加载 像微信那样,地址四个功能,点击尚为加载的Fragment显示 一个在加载的进度条(圆形的)不是ProgressDialog喔, 没有思路.

android端收到邀请时显示的xxx邀请你加入群时,如何显示邀请人的昵称

问题描述 群主邀请或者普通用户邀请好友加群,被邀请人会收到邀请消息提示有群邀请,点进群,也会显示xxx邀请你加入了群聊,如何显示邀请人的昵称,是在邀请时加入昵称,还是收到邀请后接收参数的时候把昵称加进去,具体在哪里加昵称,求大神指点,上图 解决方案 DemoHelper 这个类中的class MyGroupChangeListener implements EMGroupChangeListener 这个地方的代码你看看对应的方法中的回调了,这个昵称可以在这个方法的回调中可以自己实现的.

Android listview更改选中时item背景色

http://www.cnblogs.com/loulijun/archive/2012/04/15/2450312.html

android开发 listview的item点击后显示详细信息

问题描述 android开发 listview的item点击后显示详细信息 item 的textview点击后我把maxlines的限制去除,数据是能完整显示了,但是由于item本身的高度限制,导致textview无法正常显示,请问怎么解决 解决方案 点击ListView,显示其详细信息android listView点击item,高亮显示Android ListView点击item 显示隐匿菜单项 解决方案二: 在item的layout文件中,给item设定minHeight,即可 解决方案三

基于Android ListView之加载使用技巧_Android

程序员很多,遍地都是,高手也很多,但是懂设计的程序员并不多,我觉得我们不仅要成为一个coder还要成为一个designer. 我是一个比较注重ued的人,如果对一个app来说,程序是app的内涵那么设计就是要体现app的外在美观. 曾经看到一篇招聘用户体验设计师的信息问道   如果说,在我们身边,设计师具有表达思想的力量:工程师具有实现思想的力量.          那么请问用户体验设计师具有什么力量,有资格成为团队成员? 每个人有每个的思想每个人有每个人的见解,这就不多讲留给大家去思考. 我手

基于Android ListView之加载使用技巧

程序员很多,遍地都是,高手也很多,但是懂设计的程序员并不多,我觉得我们不仅要成为一个coder还要成为一个designer. 我是一个比较注重ued的人,如果对一个app来说,程序是app的内涵那么设计就是要体现app的外在美观. 曾经看到一篇招聘用户体验设计师的信息问道 如果说,在我们身边,设计师具有表达思想的力量:工程师具有实现思想的力量. 那么请问用户体验设计师具有什么力量,有资格成为团队成员? 每个人有每个的思想每个人有每个人的见解,这就不多讲留给大家去思考. 我手机装的应用并不多,稍微

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

demo-android QQ按住说话时显示声音大小的那个是怎么做的

问题描述 android QQ按住说话时显示声音大小的那个是怎么做的 我的QQ是347246532,哪位大师有相似的Demo,给我发份吧.不要录音的,只要显示说话音量大小就行了 解决方案 我刚好写过一个http://git.oschina.net/cocobaby/VoiceCurve 解决方案二: 不是调节声音吗?你是程序遇见了问题,? 解决方案三: 实现了,~~~~(>_<)~~~~ .跟着计时器走就行了.在计时器中每一秒来一次setProgress(value);