Когда вы открываете мое приложение, я начинаю с просмотра пейджера с различными вкладками вверху, на которые вы можете щелкнуть, и которые отображают разные фрагменты на вкладке.
Внутри фрагмента под названием «TEST» находится recyclerview, где каждый элемент в recyclerview является дочерними фрагментами.
Есть несколько кнопок, которые находятся поверх каждого фрагмента в recyclerview, поэтому, если вы нажмете кнопку карты, фрагмент может измениться на другой фрагмент, отображающий карту и т. д.
В моем адаптере recyclerview я добавляю следующий xml (example.xml), который будет представлять каждую строку recyclerview:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/groupholder"
android:background="#FFF">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/fragment_container">
</RelativeLayout>
</RelativeLayout>
Fragment_container предназначен для хранения расширенного фрагмента.
Ниже приведены соответствующие части класса RecyclerView.Adapter, которые используются для заполнения recyclerview:
//the view holder class
class ExampleViewHolder extends RecyclerView.ViewHolder {
RelativeLayout fragmentContainer;
public ExampleViewHolder(View view) {
super(view);
//we are creating a framecontainer for the fragment
fragmentContainer = (RelativeLayout) view.findViewById(R.id.fragment_container);
}
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//inflating the layout that contains the fragment for the ExampleViewHolder
v = LayoutInflater.from(parent.getContext()).inflate(R.layout.example, parent, false);
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
if (holder instanceOf ExampleViewHolder) {
//The "f" below is the fragment that gets past into this Recycler.Adapter through the adapter's constructor.
f.getChildFragmentManager().beginTransaction().add(((ExampleViewHolder) holder).fragmentContainer.getId(), new PlaceImageFragment()).commit();
//this must execute immediately.
//This is the part that crashes the app
f.getChildFragmentManager().executePendingTransactions();
}
}
Поскольку команда фиксации запланирована для асинхронного выполнения в основном потоке процесса (http://developer.android.com/reference/android/app/FragmentManager.html#executePendingTransactions()), я должен вызвать executePendingTransactions(), чтобы диспетчер фрагментов немедленно выполнил команду.
Если я не вызываю executePendingTransactions(), приложение работает, но фрагменты не заполняются сразу, и я также вижу это на экране, так как фрагменты заполняются очень медленно или в некоторых случаях вообще не заполняются.
Однако, если я вызову executePendingTransactions(), приложение вылетает с ошибкой, в которой говорится, что строка executePendingTransactions()
была причиной сбоя приложения:
java.lang.IllegalArgumentException: не найдено представление для идентификатора 0x7f0f0096 (com.example.simon:id/fragment_container) для фрагмента PlaceImageFragment{52e819f8 #0 id=0x7f0f0096}
Любые идеи, как я могу заставить это работать?
ИЗМЕНИТЬ:
Я думаю, что причина, по которой это не дает мне никакого представления, заключается в том, что getChildFragmentManager ищет в макете родительских фрагментов xml id/fragment_container, но его там не будет, поскольку родительский фрагмент содержит только recyclerview в xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
xmlns:tools="http://schemas.android.com/tools"
android:layout_height="match_parent"
android:id="@+id/main_recyclerview_holder">
<!--The padding here creates the space at the top of the ad-->
<android.support.v7.widget.RecyclerView
android:id="@+id/main_recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</RelativeLayout>
RecyclerView.Adapter
имеет специальную систему для работы с этим сценарием, предлагая пользователю методgetItemViewType()
(где вы можете указать адаптеру, что у вас есть разные типы строк, которыми нужно управлять). - person user   schedule 24.09.2015