zoukankan      html  css  js  c++  java
  • 看代码学知识之(2) ListView无数据时显示其他View

     

    看代码学知识之(2) 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。

  • 相关阅读:
    memcached源码剖析5:并发模型
    memcached源码剖析4:并发模型
    深入剖析php执行原理(4):函数的调用
    深入剖析php执行原理(2):函数的编译
    剖析php脚本的超时机制
    strerror的坑
    深入理解php中的ini配置(2)
    深入理解php中的ini配置(1)
    一个“日期”字符串进行比较的case
    用valgrind检测php扩展内存泄露
  • 原文地址:https://www.cnblogs.com/mengdd/p/3287662.html
Copyright © 2011-2022 走看看