看代码学知识之(2) ListView无数据时显示其他View
?
看代碼學(xué)知識(shí)之(2) ListView無(wú)數(shù)據(jù)時(shí)顯示其他View
?
今天看的一塊布局是這樣的:
<!--The frame layout is here since we will be showing eitherthe empty view or the list view.--><FrameLayoutandroid:layout_width="match_parent"android:layout_height="0dip"android:layout_weight="1" ><!--Here is the list. Since we are using a ListActivity, wehave to call it "@android:id/list" so ListActivity willfind it--><ListViewandroid: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 --><TextViewandroid:id="@android:id/empty"android:layout_width="match_parent"android:layout_height="match_parent"android:text="No items."android:textAppearance="?android:attr/textAppearanceMedium" /></FrameLayout>
這部分布局實(shí)際顯示的效果卻只有一個(gè)ListView,里面是數(shù)組的數(shù)據(jù)。
于是,我很好奇這個(gè)TextView去了哪里,既然放在同一個(gè)FrameLayout中,它難道不是在上層擋著?
顯然,唯一沒(méi)見(jiàn)過(guò)的就是這個(gè)TextView的id的屬性設(shè)置:
android:id="@android:id/empty"
搜索了一下,原來(lái)這個(gè)屬性值的作用就是,當(dāng)ListView關(guān)聯(lián)的Adapter中數(shù)據(jù)為空時(shí),就顯示這個(gè)TextView。
? 而這個(gè)ListView中有數(shù)據(jù)顯示時(shí),這個(gè)TextView是不可見(jiàn)的。
?
使用場(chǎng)景1
上面的布局是一個(gè)ListFragment所用的布局中的一塊,同理,當(dāng)Activity繼承ListActivity時(shí),可以直接實(shí)現(xiàn)。
即,在布局中直接用id表達(dá),不需要附加代碼:
<?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" ><ListViewandroid: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 --><TextViewandroid: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 {@Overrideprotected 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;}}
這樣當(dāng)數(shù)組長(zhǎng)度為0時(shí),將自動(dòng)顯示TextView中的內(nèi)容。而有數(shù)據(jù)時(shí),顯示ListView。
?
使用場(chǎng)景2
如果選擇不繼承ListActivity,則上面例子中的TextView,即便id被設(shè)置為android:id="@android:id/empty",也不是只有ListView為空時(shí)才顯示。
事實(shí)上,因?yàn)樵贔rameLayout中,所以這個(gè)TextView會(huì)一直顯示在ListView層之上。
當(dāng)ListView無(wú)數(shù)據(jù)時(shí)只顯示TextView;但是ListView有數(shù)據(jù)時(shí),仍然顯示這個(gè)提示“No items”的TextView(which is obviously wrong!)。
此時(shí)這個(gè)TextView的顯示與否和ListView的數(shù)據(jù)沒(méi)有什么關(guān)系了。
?
對(duì)于不繼承ListActivity的情況,要實(shí)現(xiàn)上面的效果應(yīng)該如何呢?
首先,ListView和TextView的id可以任意設(shè)置。
然后,只需要調(diào)用在代碼中調(diào)用setEmptyView(View?emptyView)設(shè)置ListView為空時(shí)顯示這個(gè)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" ><ListViewandroid:id="@+id/myList"android:layout_width="match_parent"android:layout_height="match_parent" /><!-- Here is the view to show if the list is emtpy --><TextViewandroid: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;@Overrideprotected 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;}}?
?
擴(kuò)展:
因?yàn)?span id="ze8trgl8bvbq" class="sympad" style="text-align:left;color:#222222;text-transform:none;line-height:19px;text-indent:0px;letter-spacing:normal;font-family:Roboto, sans-serif;font-style:normal;font-variant:normal;font-weight:normal;word-spacing:0px;">setEmptyView(View?emptyView)這個(gè)方法是屬于AdapterView這個(gè)類的,所以除了ListView之外,其他的子類,如GridView,Spinner等,應(yīng)該也可以用這個(gè)方法來(lái)設(shè)置Adapter數(shù)據(jù)為空時(shí)顯示另一個(gè)View。
?
轉(zhuǎn)載于:https://www.cnblogs.com/mengdd/p/3287662.html
總結(jié)
以上是生活随笔為你收集整理的看代码学知识之(2) ListView无数据时显示其他View的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: openwrt编译qca驱动不成功。gc
- 下一篇: python数据类型之间的转换