2014-03-12 46 views
0

構建Android應用程序的用戶界面有點奇怪。儘管我必須解決這個錯誤,但我不知道原因,我想了解爲什麼會發生這種情況,以便了解有關Android的更多信息。我再現場景的簡單應用:如果調用setListAdapter,則不會出現列表頁腳視圖

創建一個新的Hello World Android應用程序添加下資源這個資源文件/佈局/ footer_view.xml:

<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:gravity="center_horizontal" 
    android:text="Foo Bar" /> 

並使用此活動:

public class MainActivity extends ListActivity { 

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

     ListAdapter adapter = new ArrayAdapter(this, android.R.layout.activity_list_item); 
     setListAdapter(adapter); 
     View footer = LayoutInflater.from(this).inflate(R.layout.footer_view, getListView(), false); 
     getListView().addFooterView(footer); 
    } 

} 

我們得到如下畫面:

令我驚訝的是,我看到一個名爲「Foo Bar」的TextView的頁腳視圖丟失了。在玩了一段時間之後,我發現解決方案是移動「setListAdapter(adapter);」行添加到onCreate()方法的結尾,或者在將頁腳添加到視圖後以不同的方式表示。

探索一點進一步我發現問題是寬度,這是0,如果我有適配器之前添加。另一個解決方案是指明一個明確的寬度,而不是match_parent。

任何線索爲什麼發生這種情況?對我來說,如果因爲列表可能沒有準備好而沒有添加適配器,它會變得更直觀,但是如果一切都準備好了,爲什麼它不工作?

回答

1

原因是,在內部,如果有頁眉或頁腳,適配器將被包裝在另一個適配器內。

因此,如果在添加頁眉和頁腳視圖之前調用setAdapter,則包裝適配器不會察覺到它們。

如果您將setAdapter保留到最後,那麼包裝適配器的適配器就會知道頁眉/頁腳,因爲那些已經添加到列表中。

documentation

添加一個固定的視圖出現在列表的底部。如果不止一次調用addFooterView ,則視圖將按照它們添加的 的順序顯示。如果他們想要,使用此調用添加的視圖可以關注焦點。

注:當第一次介紹,這種方法只能 之前設置與setAdapter(ListAdapter)適配器調用。從 KITKAT開始,可以隨時調用此方法。如果ListView的 適配器不擴展HeaderViewListAdapter,則它將與 包裝爲WrapperListAdapter的支持實例。