如果调用setListAdapter,则不会显示列表页脚视图

时间:2014-03-12 21:24:13

标签: android android-layout android-listview

我为Android应用程序构建UI有点奇怪。虽然我必须解决错误,但我不知道原因,我想了解为什么会发生这种情况以便了解有关Android的更多信息。我在一个简单的应用程序中重现了这个场景:

创建一个新的Hello World Android应用程序,在res / layout / 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);
    }

}

我们得到以下屏幕:

令我惊讶的是,我看到页脚视图,这是一个TextView说“Foo Bar”,却丢失了。经过一番游戏,我发现解决方案是移动“setListAdapter(adapter);”在将oner添加到视图之后,将行放到onCreate()方法的末尾,或换句话说。

进一步探索我发现问题是宽度,如果我之前添加了适配器,则为0。另一个解决方案是指示除match_parent之外的显式宽度。

有什么理由发生这种情况?对我而言,如果没有添加适配器,因为列表可能没有准备好,但是如果所有内容都准备好了,为什么它不起作用呢?

1 个答案:

答案 0 :(得分:1)

原因是在内部,如果有页眉或页脚,适配器将被包装在另一个适配器中。

因此,如果在添加页眉和页脚视图之前调用setAdapter,则包装适配器不会识别它们。

如果将setAdapter保留到最后,则包装适配器的适配器会知道页眉/页脚,因为这些已添加到列表中。

请参阅documentation

  

添加固定视图以显示在列表底部。如果是addFooterView   不止一次被调用,视图将按照它们的顺序出现   添加。使用此调用添加的视图可以在需要时获得焦点。

     

注意:首次引入时,此方法只能在之前调用   使用setAdapter(ListAdapter)设置适配器。从...开始   KITKAT,可以随时调用此方法。如果是ListView的话   适配器不会扩展HeaderViewListAdapter,它将被包装   WrapperListAdapter的支持实例。