Только что внедрил Recyclerview в свой код, заменив Listview.
Все работает отлично. Объекты отображаются.
но logcat говорит
15:25:53.476 E/RecyclerView﹕ No adapter attached; skipping layout
15:25:53.655 E/RecyclerView﹕ No adapter attached; skipping layout
для кода
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
, я получаю то же самое сообщение.
В моем фрагменте
вызов приведенного ниже кода из метода 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) Я не делал этого, как показано в верхнем ответе: https://stackoverflow.com/questions/24503760/cardview-layout-width-match-parent-does-not-match-parent-recyclerview-width.
//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
android:id="@+id/RecyclerView"
class="android.support.v7.widget.RecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
Я видел несколько руководств, использующих последний метод. Хотя он работает, я думаю, что он также генерирует эту ошибку.
У меня такая же ситуация с тобой, дисплей ок, но ошибки появляются в месте. Что'мое решение: (1) инициализировать RecyclerView &ампер; адаптер свяжете на создание()
RecyclerView mRecycler = (RecyclerView) this.findViewById(R.id.yourid);
mRecycler.setAdapter(adapter);
(2) вызов notifyDataStateChanged, когда вы получаете данные
adapter.notifyDataStateChanged();
В recyclerView'исходный код s, есть другой поток, чтобы проверить состояние данных.
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 позволяет любой высоты) и, как следствие, становится равной минимальной высоте (по реализации), который, видимо, ноль.
У вас есть несколько вариантов для решения:
(Может применяться для андроида.поддержка.В4.виджет.NestedScrollView` а)
// SampleHolder.java
public class SampleHolder extends RecyclerView.ViewHolder {
public SampleHolder(View itemView) {
super(itemView);
}
}
<ч />
// 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;
}
}
<ч />
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;
}
Убедитесь, что вы установить менеджер компоновки для RecyclerView с помощью:
mRecyclerView.setLayoutManager(new LinearLayoutManager(context));
Вместо LinearLayoutManager
, вы можете использовать other менеджеры по расположению тоже.
Проверьте, если вы пропустили, чтобы вызвать этот метод в адаптер
@Override
public int getItemCount() {
return list.size();
}
Это происходит потому, что фактический надувается макет отличается от того, который сослался на вас при поиске recyclerView. По умолчанию при создании фрагмента, метод onCreateView следующим образом: возвращения насос.надуть(Р. макета.<родственные макет>,контейнер.значение false);`
Вместо этого, отдельно создать представление и использовать это, чтобы обратиться к recyclerView
Просмотр= инфлятор.надуть(Р. макета.<родственные макет>,контейнер.ложь); recyclerview=вид.команду findViewById(Р. ИД.<ИД recyclerView и GT;); возвращение зрения;
Эти линии должны быть в метод onCreate`:
mmAdapter = new Adapter(msgList);
mrecyclerView.setAdapter(mmAdapter);
Я решил эту ошибку. Вам просто нужно добавить менеджера компоновки и добавить пустой адаптер.
Такой код:
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
//}
Для тех, кто пользуется RecyclerView
в <б>фрагмент</б> и надуть его с другими представлениями: при накачивании весь фрагмент вид, убедитесь, что вы связали `RecyclerView в его корне посмотреть.
<п>я был связан и делает все для адаптер правильно, но я никогда не делал привязку.
Это в <а href="и https://stackoverflow.com/a/48389399/5450198">ответ</а> по <и>@Prateek Агарвал</а> все это для меня, но здесь более подробно.</п>
<п><б>Котлин</б></п>
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val rootView = inflater?.inflate(R.layout.fragment_layout, container, false)
recyclerView = rootView?.findViewById(R.id.recycler_view_id)
// rest of my stuff
recyclerView?.setHasFixedSize(true)
recyclerView?.layoutManager = viewManager
recyclerView?.adapter = viewAdapter
// return the root view
return rootView
}
<б>Ява</б>
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView= inflater.inflate(R.layout.fragment_layout,container,false);
recyclerview= rootView.findViewById(R.id.recycler_view_id);
return rootView;
}
Сначала инициализировать адаптер
public void initializeComments(){
comments = new ArrayList<>();
comments_myRecyclerView = (RecyclerView) findViewById(R.id.comments_recycler);
comments_mLayoutManager = new LinearLayoutManager(myContext);
comments_myRecyclerView.setLayoutManager(comments_mLayoutManager);
updateComments();
getCommentsData();
}
public void updateComments(){
comments_mAdapter = new CommentsAdapter(comments, myContext);
comments_myRecyclerView.setAdapter(comments_mAdapter);
}
Когда происходит изменение в наборе данных, просто вызовите метод updateComments.
Просто добавьте следующие строки в RecyclerView
app:layoutManager="android.support.v7.widget.LinearLayoutManager"
Пример:
<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"
app:layoutManager="android.support.v7.widget.LinearLayoutManager"
app:layout_constraintBottom_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
</android.support.v7.widget.RecyclerView>
ArtistArrayAdapter adapter = new ArtistArrayAdapter(this, artists);
recyclerView = (RecyclerView) findViewById(R.id.cardList);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapter);
Просто замените код выше с этого и он должен работать. Что вы сделали неправильно, вы назвали setAdapter(Адаптер) перед вызовом менеджера компоновки.
Это действительно просто ошибка, что вы получаете, нет необходимости делать какие-либо коды в этом. Эта ошибка возникает из-за неправильного файла макета, используемого в деятельности. По среде IDE автоматически созданный макет в21 макета, который стал макетом действия по умолчанию. все коды я в старый файл макета, и новое было только несколько XML-кодов, которые привели к этой ошибке.
Решение: скопируйте все коды из старого макета и вставить в макет в 21
В моем случае, я сидел адаптер внутри метода onlocationchanged()` callback и отладки в эмуляторе. Поскольку он не'т обнаружены изменения местоположения в него никогда не стреляли. Когда я установил их вручную в расширенном управления эмулятора он работал, как ожидалось.
Он работал для меня.
андроид:usesCleartextTraffic=то"Правда"и
для Android.поддержка.В7.виджет.CardView
Заменить cardview XML дизайн с андроида X. Должны быть такими;
androidx.cardview.виджет.CardView
для Android.поддержка.В7.виджет.RecyclerView
Заменить cardview XML дизайн с андроида X. Должны быть такими;
androidx.recyclerview.виджет.RecyclerView