2014-03-12 22 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的支持实例。