Фрагмент с RecyclerView: java.lang.IllegalArgumentException: обрывки или прикрепленные представления не могут быть переработаны. IsScrap: false isAttached: true

Я продолжаю получать java.lang.IllegalArgumentException: обрывки или прикрепленные представления не могут быть переработаны. IsScrap: false isAttached: true при использовании Fragment с RecyclerView. У меня есть только 1 активность, которая переключается между несколькими фрагментами. В onCreate активности я устанавливаю фрагмент по умолчанию, который, как оказалось, имеет RecyclerView, реализованный точно так же, как в документации. При запуске активности я получаю java.lang.IllegalArgumentException: обрывки или прикрепленные представления не могут быть переработаны. IsScrap: false isAttached: true .

Проблема в том, что я загружаю в начале пустой контейнер с фрагментами, а затем перейду к фрагменту с помощью RecyclerView, он отлично работает. Также я не использую android: animateLayoutChanges или notifyDataSetChanged (), как указано здесь. В настоящее время я настраиваю RecyclerView в методе onResume () фрагмента. Я попытался переключить его на другие методы жизненного цикла, но не удачу.

Любая помощь приветствуется.

благодаря

Я добавил только соответствующие фрагменты кода. Я считаю, что это связано с каким-то жизненным циклом, учитывая тот факт, что он работает, если я не устанавливаю фрагмент в onCreate () Activity. Он работал, когда у меня был ListView вместо RecyclerView. Я не размещал код для RecyclerView, потому что он такой же, как в документации.

Действие onCreate

public void onCreate(Bundle savedInstanceState) { Log.d(TAG,"### onCreate ###"); super.onCreate(savedInstanceState); setContentView(R.layout.efficientix_activity_layout); if(savedInstanceState != null){ checkedSideMenuItemLabel = savedInstanceState.getInt("checkedSideMenuItemLabel"); } //Init components initActionBar(checkedSideMenuItemLabel,savedInstanceState); initSideMenuArrayAdapter(); initSideMenu(checkedSideMenuItemLabel,savedInstanceState); initActionBarDrawerToggle(); fragmentManager = this.getSupportFragmentManager(); if(savedInstanceState == null){ //Set default fragment upon activity creation. FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); DashboardFragment df = new DashboardFragment(); fragmentTransaction.replace(R.id.fragment_container,df,DashboardFragment.class.toString()); fragmentTransaction.commit(); } } 

Фрагмент onResume ()

 public void onResume() { super.onResume(); if (recylerViewLayoutManager == null) { recylerViewLayoutManager = new LinearLayoutManager(this.getActivity()); } recylerView.setLayoutManager(remindersLayoutManager); initRecylerViewAdapter(); recylerView.setAdapter(recylerViewAdapter); } 

Макет фрагмента

  <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/myRecyclerView" style="@style/Main_Content_List_View"/> </LinearLayout> 

Макет мероприятия

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:efficientix="http://schemas.android.com/apk/res-auto" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- The actionbar toolbar --> <include layout="@layout/actionbar_toolbar"/> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/menu_layout" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/fragment_container" android:orientation="vertical"> </LinearLayout> <include layout="@layout/side_menu_layout"/> </android.support.v4.widget.DrawerLayout> </LinearLayout> 

Макет элемента RecyclerView

 <?xml version="1.0" encoding="utf-8"?> <android.widget.TableLayout xmlns:android="http://schemas.android.com/apk/res/android" style="@style/Main_Content_Table_Layout_List_Item"> <TableRow style="@style/Main_Content_Table_Row_List_Item"> <TextView android:id="@+id/description" style="@style/Main_Content_TextView" /> <ImageView android:id="@+id/category" style="@style/Main_Content_ImageView"/> </TableRow> <TableRow style="@style/Main_Content_Table_Row_List_Item"> <TextView android:id="@+id/alert_date" style="@style/Main_Content_TextView" /> <TextView android:id="@+id/type" style="@style/Main_Content_TextView" /> </TableRow> </android.widget.TableLayout> 

Хорошо, поэтому я обнаружил, что проблема была. В моем ViewHolder я имел в дополнение к макету Views, объекту ORMlite (может быть, любой объект, который не был частью макета). Проблема заключалась в том, что методы equals () и hashcode () ViewHolder были основаны на сущности, которая была нулевой. Причина, по которой это было null, состояла в том, что с RecyclerView у вас нет доступа к позиции данных в onCreateViewHolder (), а только в onBindViewHolder (). Данные адаптера – это список объектов ORMlite в моем случае, и я хочу связать объект внутри держателя. (Все еще нужно найти способ сделать это …)

В этом случае я ожидал исключение NullPointerException. Мне удалось получить исключение NullPointerException, вызвав файл owner.setIsRecyclable (true).

Надеюсь, это поможет другим, кто в этом нуждается.

благодаря

Я видел, как это произошло для меня, когда я использовал пользовательский объект в ViewHolder для адаптера Recycler View.

Чтобы исправить проблему, я очистил пользовательский объект, который в моем случае был таймером в onViewRecycled (держатель ViewHolder) для адаптера, как показано ниже:

 public void onViewRecycled(ViewHolder holder) { if(holder instanceof EntityViewHolder) { if(((EntityViewHolder)holder).timer != null) { ((EntityViewHolder) holder).timer.cancel(); } } super.onViewRecycled(holder); } 

Это исправило ошибку.

Intereting Posts
Андроидальные константы файла R не поддерживают автоматическое обновление NullPointerException при включении перетаскивания-list-listview из OnItemLongClickListener в виде списка Как настроить cookie в клиенте android WebView NullPointer при запускеIntentSenderForResult, inappbilling V3 Могу ли я разработать приложение для Android, используя только LIBGDX без особого знания компонентов ОС Android? Проверьте, завершена ли анимация AnimatorSet? Разница между glOrthof и glViewPort Как создать / скомпилировать приложение ndk? Как получить имя класса обслуживания в Android? Android. SQLite Исключение: нет такого столбца _id Запуск эспрессо после профайлинга приложения, но не проверка Как добавить столбец в onUpgrade и установить существующие строки на определенное значение? Добавление кнопки в каждую строку в списке Android google analytics показывает посещения россии без установки приложения на любом устройстве Android: вращение изображения с высоким разрешением генерирует ошибку из памяти