Вещь ListView
прикрепляет заголовок в какой-то момент позже, чем onResume()
.
Таким образом, вы должны добавить только фрагмент после Заголовок заголовка добавляется в иерархию представления. Кроме того, вам нужно удалить фрагмент из FragmentManager
в onPause()
, потому что в противном случае, возвращаясь к этому фрагменту, FragmentManager
все равно будет знать ранее добавленный фрагмент и попытаться найти вид по указанному id
. Если будет недоступно, пока до ListView
не присоединяет заголовок.
Существует также полезная информация. Если вы:
- Пролистайте список вниз
- Нажмите некоторый элемент
- Перейти на другой экран/активности
- Нажмите HW назад
Теперь ListView
позиционируется выглядеть так же, как это было перед выходом на экран в (3). Однако, HeaderFragment
еще не прилагается. Затем, если вы прокрутите страницу до тех пор, пока заголовок не станет видимым, он будет прикреплен. Затем добавим HeaderFragment
в представление заголовка и изменения высоты заголовка. И затем, странные вещи происходят в ListView
. Я еще не решил это.
Если ваш HeaderFragment
имеет фиксированную высоту, вы можете установить вид заголовка таким высоким и избежать этой проблемы в целом.
Предполагая, что вы показываете ListView
в 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"/>
Попробуйте установить вид заголовка в 'FrameLayout', а затем добавить в ваш фрагмент. – rciovati