Recycliewiew Не подключен адаптер; Пропуская макет

Просто реализовал Recyclerview в моем коде, заменив Listview.

Все работает нормально. Отображаются объекты.

Но logcat говорит

15: 25: 53.476 E / RecyclerView: адаптер не подключен; Пропуская макет

15: 25: 53.655 E / RecyclerView: адаптер не подключен; Пропуская макет

Для кода

ArtistArrayAdapter adapter = new ArtistArrayAdapter(this, artists); recyclerView = (RecyclerView) findViewById(R.id.cardList); recyclerView.setHasFixedSize(true); recyclerView.setAdapter(adapter);`` recyclerView.setLayoutManager(new LinearLayoutManager(this)); 

Как вы можете видеть, я подключил адаптер для recycleview. Так почему я продолжаю получать эту ошибку?

Я прочитал другие вопросы, связанные с одной и той же проблемой, но никто не помогает.

Можете ли вы убедиться, что вы вызываете эти утверждения из «основного» потока (например, внутри onCreate() ). Как только я вызываю одни и те же заявления из метода «с задержкой». В моем случае ResultCallback я получаю одно и то же сообщение.

В моем Fragment вызов кода изнутри метода ResultCallback вызывает одно и то же сообщение. После перемещения кода в метод onConnected() в моем приложении сообщение исчезло …

 LinearLayoutManager llm = new LinearLayoutManager(this); llm.setOrientation(LinearLayoutManager.VERTICAL); list.setLayoutManager(llm); list.setAdapter( adapter ); 

Я получал те же два сообщения об ошибках, пока не зафиксировал две вещи в моем коде:

(1) По умолчанию при реализации методов в RecyclerView.Adapter он генерирует:

  @Override public int getItemCount() { return 0; } 

Убедитесь, что вы обновили свой код, чтобы он сказал:

  @Override public int getItemCount() { return artists.size(); } 

Очевидно, если у вас есть нулевые предметы в ваших предметах, вы получите нулевые вещи, отображаемые на экране.

(2) Я не делал этого, как показано в верхнем ответе: CardView layout_width = "match_parent" не соответствует родительской ширине RecyclerView

 //correct LayoutInflater.from(parent.getContext()) .inflate(R.layout.card_listitem, parent, false); //incorrect (what I had) LayoutInflater.from(parent.getContext()) .inflate(R.layout.card_listitem,null); 

(3) EDIT: BONUS: Также убедитесь, что вы настроили RecyclerView следующим образом:

  <android.support.v7.widget.RecyclerView android:id="@+id/RecyclerView" android:layout_width="match_parent" android:layout_height="match_parent" /> 

Не так:

  <view class="android.support.v7.widget.RecyclerView" android:id="@+id/RecyclerView" android:layout_width="match_parent" android:layout_height="match_parent" /> 

Я видел некоторые уроки, используя последний метод. Хотя он работает, я думаю, что он также генерирует эту ошибку.

У меня такая же ситуация с вами, дисплей в порядке, но ошибка появляется в локаторе. Это мое решение: (1) Инициализировать адаптер RecyclerView & bind ON CREATE ()

 RecyclerView mRecycler = (RecyclerView) this.findViewById(R.id.yourid); mRecycler.setAdapter(adapter); 

(2) вызывать notifyDataStateChanged, когда вы получаете данные

 adapter.notifyDataStateChanged(); 

В исходном коде recyclerView есть другой поток для проверки состояния данных.

 public RecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); this.mObserver = new RecyclerView.RecyclerViewDataObserver(null); this.mRecycler = new RecyclerView.Recycler(); this.mUpdateChildViewsRunnable = new Runnable() { public void run() { if(RecyclerView.this.mFirstLayoutComplete) { if(RecyclerView.this.mDataSetHasChangedAfterLayout) { TraceCompat.beginSection("RV FullInvalidate"); RecyclerView.this.dispatchLayout(); TraceCompat.endSection(); } else if(RecyclerView.this.mAdapterHelper.hasPendingUpdates()) { TraceCompat.beginSection("RV PartialInvalidate"); RecyclerView.this.eatRequestLayout(); RecyclerView.this.mAdapterHelper.preProcess(); if(!RecyclerView.this.mLayoutRequestEaten) { RecyclerView.this.rebindUpdatedViewHolders(); } RecyclerView.this.resumeRequestLayout(true); TraceCompat.endSection(); } } } }; 

В dispatchLayout () мы можем найти ошибку в нем:

 void dispatchLayout() { if(this.mAdapter == null) { Log.e("RecyclerView", "No adapter attached; skipping layout"); } else if(this.mLayout == null) { Log.e("RecyclerView", "No layout manager attached; skipping layout"); } else { 

У меня есть эта проблема, проблема в несколько раз – recycleView, помещенный в объект ScrollView

После проверки реализации причина заключается в следующем. Если RecyclerView попадает в ScrollView, то во время шага измерения его высота не указывается (потому что ScrollView позволяет любую высоту) и, как результат, получает равную минимальную высоту (согласно реализации), которая, по-видимому, равна нулю.

У вас есть несколько вариантов для этого:

  1. Установите определенную высоту в RecyclerView
  2. Установите ScrollView.fillViewport в true
  3. Или сохраните RecyclerView вне ScrollView. На мой взгляд, это лучший вариант. Если высота RecyclerView не ограничена – это случай, когда она помещается в ScrollView, тогда все представления Adapter имеют достаточно места вертикально и создаются сразу. В настоящее время нет никакой утилизации просмотра, которая как бы нарушает цель RecyclerView.

1) Создайте ViewHolder , который ничего не делает 🙂

 // SampleHolder.java public class SampleHolder extends RecyclerView.ViewHolder { public SampleHolder(View itemView) { super(itemView); } } 

2) Снова создайте RecyclerView , который ничего не делает 🙂

 // SampleRecycler.java public class SampleRecycler extends RecyclerView.Adapter<SampleHolder> { @Override public SampleHolder onCreateViewHolder(ViewGroup parent, int viewType) { return null; } @Override public void onBindViewHolder(SampleHolder holder, int position) { } @Override public int getItemCount() { return 0; } } 

3) Теперь, когда ваш настоящий переработчик не готов, просто используйте образец, как показано ниже.

 RecyclerView myRecycler = (RecyclerView) findViewById(R.id.recycler_id); myRecycler.setLayoutManager(new LinearLayoutManager(this)); myRecycler.setAdapter(new SampleRecycler()); 

Это не лучшее решение, но оно работает! Надеюсь, это полезно.

Это происходит, когда вы не устанавливаете адаптер во время фазы создания:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity); mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); .... } public void onResume() { super.onResume(); mRecyclerView.setAdapter(mAdapter); .... } 

Просто переместите параметр адаптера в onCreate с пустыми данными и когда у вас есть вызов данных:

 mAdapter.notifyDataSetChanged(); 

У меня была такая же ошибка, я исправил это, если вы ожидаете, что такие данные, как я, используют модификацию или что-то в этом роде

Положить перед Oncreate

 private ArtistArrayAdapter adapter; private RecyclerView recyclerView; 

Поместите их в свой Oncreate

  recyclerView = (RecyclerView) findViewById(R.id.cardList); recyclerView.setHasFixedSize(true); recyclerView.setLayoutManager(new LinearLayoutManager(this)); adapter = new ArtistArrayAdapter( artists , R.layout.list_item ,getApplicationContext()); recyclerView.setAdapter(adapter); 

Когда вы получаете данные

 adapter = new ArtistArrayAdapter( artists , R.layout.list_item ,getApplicationContext()); recyclerView.setAdapter(adapter); 

Теперь перейдите в класс ArtistArrayAdapter и сделайте так, как он будет делать, если ваш массив пуст или имеет значение null, это приведет к возврату GetItemCount 0, если он не сделает его размером массива художников

 @Override public int getItemCount() { int a ; if(artists != null && !artists.isEmpty()) { a = artists.size(); } else { a = 0; } return a; } 

Это действительно простая ошибка, которую вы получаете, в этом нет необходимости делать какие-либо коды. Эта ошибка возникает из-за неправильного файла макета, используемого для этой операции. В IDE я автоматически создал макет v21 макета, который стал макетом по умолчанию для этой операции. Все коды, которые я сделал в старом файле макета, а новый – только несколько кодов xml, что привело к этой ошибке.

Решение. Скопируйте все коды старого макета и вставьте в макет v 21

Убедитесь, что вы настроили диспетчер компоновки для своего RecyclerView:

 mRecyclerView.setLayoutManager(new LinearLayoutManager(context)); 

Вместо LinearLayoutManager вы также можете использовать другие менеджеры макетов.

Эти строки должны быть в OnCreate :

 mmAdapter = new Adapter(msgList); mrecyclerView.setAdapter(mmAdapter); 

В моем случае я устанавливал адаптер внутри onLocationChanged() обратного вызова и отладки в эмуляторе. Поскольку он не обнаружил изменения местоположения, он никогда не запускался. Когда я устанавливал их вручную в элементах расширенного управления эмулятором, он работал, как ожидалось.

Я решил эту ошибку. Вам просто нужно добавить менеджер компоновки и добавить пустой адаптер.

Как этот код:

 myRecyclerView.setLayoutManager(...//your layout manager); myRecyclerView.setAdapter(new RecyclerView.Adapter() { @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return null; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { } @Override public int getItemCount() { return 0; } }); //other code's // and for change you can use if(mrecyclerview.getadapter != speacialadapter){ //replice your adapter //} 
 ArtistArrayAdapter adapter = new ArtistArrayAdapter(this, artists); recyclerView = (RecyclerView) findViewById(R.id.cardList); recyclerView.setHasFixedSize(true); recyclerView.setLayoutManager(new LinearLayoutManager(this)); recyclerView.setAdapter(adapter); 

Просто замените выше код на это, и он должен работать. Что вы сделали неправильно, вы вызываете setAdapter (адаптер) перед вызовом менеджера макетов.