我为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之外的显式宽度。
有什么理由发生这种情况?对我而言,如果没有添加适配器,因为列表可能没有准备好,但是如果所有内容都准备好了,为什么它不起作用呢?
答案 0 :(得分:1)
原因是在内部,如果有页眉或页脚,适配器将被包装在另一个适配器中。
因此,如果在添加页眉和页脚视图之前调用setAdapter
,则包装适配器不会识别它们。
如果将setAdapter
保留到最后,则包装适配器的适配器会知道页眉/页脚,因为这些已添加到列表中。
请参阅documentation:
添加固定视图以显示在列表底部。如果是addFooterView 不止一次被调用,视图将按照它们的顺序出现 添加。使用此调用添加的视图可以在需要时获得焦点。
注意:首次引入时,此方法只能在之前调用 使用setAdapter(ListAdapter)设置适配器。从...开始 KITKAT,可以随时调用此方法。如果是ListView的话 适配器不会扩展HeaderViewListAdapter,它将被包装 WrapperListAdapter的支持实例。