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

Просто реализовано 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. так почему я продолжаю получать эту ошибку?

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

Ответ 1

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

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

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

Ответ 2

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

(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
    android:id="@+id/RecyclerView"
    class="android.support.v7.widget.RecyclerView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

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

Ответ 3

У меня с вами такая же ситуация, дисплей в порядке, но ошибка появляется в локации. Это мое решение: (1) Инициализация адаптера RecyclerView и привязки 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 {

Ответ 4

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

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

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

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

(Может использоваться для android.support.v4.widget.NestedScrollView а также)

Ответ 5

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) Теперь, когда ваш настоящий recycler не готов, просто используйте образец, как показано ниже.

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

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

Ответ 6

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

@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();

Ответ 7

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

mRecyclerView.setLayoutManager(new LinearLayoutManager(context));

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

Ответ 8

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

Поставить перед 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;
}

Ответ 9

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

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

Ответ 10

Это происходит из-за того, что фактический раздутый макет отличается от фактического раздутого макета, который передается вами при поиске recyclerView. По умолчанию при создании фрагмента метод onCreateView выглядит следующим образом: return inflater.inflate(R.layout.<related layout>,container.false);

Вместо этого отдельно создайте представление и используйте его для ссылки на recyclerView View view= inflater.inflate(R.layout.<related layout>,container.false); recyclerview=view.findViewById(R.id.<recyclerView ID>); return view; View view= inflater.inflate(R.layout.<related layout>,container.false); recyclerview=view.findViewById(R.id.<recyclerView ID>); return view;

Ответ 11

Проверьте, не пропустили ли вы этот метод в своем адаптере

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

Ответ 12

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

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

Ответ 13

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

Как этот код:

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 
// and for change you can use if(mrecyclerview.getadapter != speacialadapter){
//replice your adapter
//}

Ответ 14

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

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

Ответ 15

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

Ответ 16

Сначала инициализируйте адаптер

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.

Ответ 17

Просто добавьте следующее в 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>

Ответ 18

В моей ситуации это был забытый компонент, который находится в классе ViewHolder, но он не находился в файле макета

Ответ 19

У меня была та же проблема, и я понял, что устанавливаю как LayoutManage r, так и адаптер после извлечения данных из моего источника вместо установки двух в onCreate.

salesAdapter = new SalesAdapter(this,ordersList);
        salesView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
        salesView.setAdapter(salesAdapter);

Затем уведомили адаптер об изменении данных

               //get the Orders
                Orders orders;
                JSONArray ordersArray = jObj.getJSONArray("orders");
                    for (int i = 0; i < ordersArray.length() ; i++) {
                        JSONObject orderItem = ordersArray.getJSONObject(i);
                        //populate the Order model

                        orders = new Orders(
                                orderItem.getString("order_id"),
                                orderItem.getString("customer"),
                                orderItem.getString("date_added"),
                                orderItem.getString("total"));
                        ordersList.add(i,orders);
                        salesAdapter.notifyDataSetChanged();
                    }

Ответ 20

Эта проблема связана с тем, что вы не добавляете LayoutManager для своего RecyclerView.

Другая причина в том, что вы вызываете этот код в NonUIThread. Обязательно вызовите этот вызов в UIThread.

Решение состоит только в том, что вы должны добавить LayoutManager для RecyclerView до setAdapter в потоке пользовательского интерфейса.

recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));

Ответ 21

Моя проблема заключалась в том, что мое ресайклирование выглядело так

        <android.support.v7.widget.RecyclerView
        android:id="@+id/chatview"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent">
    </android.support.v7.widget.RecyclerView>

Когда это должно было выглядеть так

       <android.support.v7.widget.RecyclerView
        android:id="@+id/chatview"
        android:layout_width="395dp"
        android:layout_height="525dp"
        android:layout_marginTop="52dp"
        app:layout_constraintTop_toTopOf="parent"
        tools:layout_editor_absoluteX="8dp"></android.support.v7.widget.RecyclerView>
</android.support.constraint.ConstraintLayout>

Ответ 22

В классе адаптера RecyclerView, например MyRecyclerViewAdapter, создайте конструктор со следующими параметрами.

MyRecyclerViewAdapter(Context context, List<String> data) {
    this.mInflater = LayoutInflater.from(context); // <-- This is the line most people include me miss
    this.mData = data;
}

mData - это данные, которые вы передадите адаптеру. Это необязательно, если у вас нет данных, которые нужно передать. mInflater - это объект LayoutInflater который вы создали, и используете его в функции OnCreateViewHolder адаптера.

После этого вы присоединяете адаптер в MainActivity или где хотите, по основному/пользовательскому интерфейсу,

MyRecyclerViewAdapter recyclerAdapter;
OurDataStuff mData;

    ....
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //Like this:

        RecyclerView recyclerView = findViewById(R.id.recyclerView);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerAdapter = new RecyclerAdapter(this, mData); //this, is the context. mData is the data you want to pass if you have any
        recyclerView.setAdapter(recyclerAdapter);
    }
   ....

Ответ 23

Решается путем установки инициализированного пустого списка и адаптера внизу и вызова notifyDataSetChanged при получении результатов.

    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
    recyclerviewItems.setLayoutManager(linearLayoutManager);
    someAdapter = new SomeAdapter(getContext(),feedList);
    recyclerviewItems.setAdapter(someAdapter);

Ответ 24

Для тех, кто использует RecyclerView внутри фрагмента и раздувает его из других представлений: при раздувании всего представления фрагмента убедитесь, что вы RecyclerView к его корневому представлению.

Я правильно подключался и делал все для адаптера, но я никогда не делал привязку. В этом ответе @Prateek Agarwal есть все для меня, но здесь есть более подробное описание.

Котлин

    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;
}

Ответ 25

Я потерял 16 минут своей жизни с этой проблемой, поэтому я просто признаюсь в этой невероятно смущающей ошибке, что я был making-. Я использую Butterknife, и я привязываю представление в onCreateView в этом фрагменте.

Потребовалось много времени, чтобы понять, почему у меня не было диспетчера макетов, но, очевидно, эти представления вводятся так, что на самом деле они не будут нулевыми, поэтому переработчик никогда не будет пустым.

@BindView(R.id.recycler_view)
RecyclerView recyclerView;

    @Override
public View onCreateView(......) {
    View v = ...;
    ButterKnife.bind(this, v);
    setUpRecycler()
 }

public void setUpRecycler(Data data)
   if (recyclerView == null) {
 /*very silly because this will never happen*/
       LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
       //more setup
       //...
    }
    recyclerView.setAdapter(new XAdapter(data));
}

Если у вас возникает проблема, подобная этой трассировке, и используйте что-то вроде uiautomatorviewer

Ответ 26

Не так много ответа, но у меня была такая же проблема, даже с правильным кодом. Иногда это просто самый простой из них. В этом случае ошибка OP также может отсутствовать <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> из манифеста, который воспроизводит ту же ошибку.

Ответ 27

В моем случае это произошло потому, что я встроил RecyclerView в LinearLayout.

Раньше у меня был файл макета, содержащий только один корень RecyclerView следующим образом

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView
    android:id="@+id/list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:listitem="@layout/fragment_products"

    android:name="Products.ProductsFragment"
    app:layoutManager="LinearLayoutManager"
    tools:context=".Products.ProductsFragment"

    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"/>

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

Ответ 28

Добавление еще одного ответа, так как я наткнулся на эту тему, погуглив ошибку. Я пытался инициализировать PreferenceFragmentCompat но я забыл надуть XML предпочтения в onCreatePreferences следующим образом:

class SettingsFragment : PreferenceFragmentCompat() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val inflater = LayoutInflater.from(context)
        inflater.inflate(R.layout.fragment_settings, null)
    }

    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        // Missing this line here:
        //   setPreferencesFromResource(R.xml.settings, rootKey)
    }
}

Ошибка была загадкой, пока я не понял, что PreferenceFragmentCompat должен использовать RecyclerView внутри.

Ответ 29

//Это происходит, когда вы не устанавливаете адаптер на этапе создания: вызывайте notifyDataSetChanged(), когда ответ API получает свою работу

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity);


        magazineAdapter = new MagazineAdapter(getContext(), null, this );
        newClipRecyclerView.setAdapter(magazineAdapter);
        magazineAdapter.notifyDataSetChanged();

       APICall();
}

public void APICall() {
    if(Response.isSuccessfull()){
    mRecyclerView.setAdapter(mAdapter);
   }
}
Just move setting the adapter into onCreate with an empty data and when you have the data call:

mAdapter.notifyDataSetChanged();