事情是ListView
在稍后的某个时间附加标题视图onResume()
。
因此,只有在将标题视图添加到视图层次结构后,您才必须添加片段。此外,您需要从FragmentManager
in中删除片段onPause()
,否则,在返回此片段时,FragmentManager
仍会知道先前添加的片段,并尝试按id
指定查找视图。ListView
如果在再次附加标题视图之前不可用。
还有一个问题。如果你:
- 向下滚动列表
- 单击某个项目
- 转到另一个屏幕/活动
- 按硬件返回
现在ListView
被定位为看起来就像在 (3) 中离开屏幕之前所做的一样。不过,HeaderFragment
还没有附上。然后,如果您向上滚动直到标题视图变得可见,它就会被附加。然后我们添加HeaderFragment
到标题视图和标题视图的高度变化。然后,奇怪的事情发生在ListView
. 我还没有解决这个问题。
如果您HeaderFragment
的高度是固定的,您可以将标题视图设置为那么高,并完全避免这个问题。
假设您ListView
在 a中显示Fragment
,这是我解决此问题的方法:
public class MyListFragment extends Fragment {
private Fragment headerFragment;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
headerFragment = HeaderFragment.newInstance();
}
@Override
public final View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.list_layout, container, false);
ListView list = (ListView) v.findViewById(R.id.list);
View headerContainer = inflater.inflate(R.layout.list_header_container);
list.addHeaderView(headerContainer);
headerContainer.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
@Override public void onViewDetachedFromWindow(View v) {}
@Override public void onViewAttachedToWindow(View v) {
getChildFragmentManager()
.beginTransaction()
.add(R.id.list_header_container, headerFragment)
.commit();
}
});
// Set adapter etc
return v;
}
@Override
public void onPause() {
super.onPause();
getChildFragmentManager()
.beginTransaction()
.remove(headerFragment)
.commit();
}
}
list_header_container.xml
:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/list_header_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>