it-swarm.com.ru

recyclerview Нет прилагаемого адаптера; пропускающий макет

Только что реализовал Recyclerview в моем коде, заменив Listview.

все отлично работает Объекты отображаются.

но LogCat говорит

15: 25: 53.476 E/RecyclerView adapter Адаптер не подключен; пропускающий макет

15: 25: 53.655 E/RecyclerView adapter Адаптер не подключен; пропускающий макет

для кода

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

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

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

177
equitharn

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

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

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

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

(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) Правка: БОНУС: Также убедитесь, что вы настроили 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" />

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

35
Micro

У меня такая же ситуация с вами, с дисплеем все в порядке, но в локации появляется ошибка . Вот мое решение: (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 {
19
Keith Gong

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

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

9
Madan Sapkota

у меня есть эта проблема, несколько раз проблема recycleView положить в ScrollView объект

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

У вас есть несколько вариантов исправить это:

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

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

9
FxRi4

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

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

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

mRecyclerView.setLayoutManager(new LinearLayoutManager(context));

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

3
Sumit Jha

Это происходит потому, что фактический раздутый макет отличается от того, на который вы ссылались при поиске 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;

2
Prateek Agarwal

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

Поставить перед созданием

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 и сделайте следующее: если ваш массив пуст или равен нулю, GetItemCount вернет 0, если нет, то он будет иметь размер массива художников.

@Override
public int getItemCount() {

    int a ;

    if(artists != null && !artists.isEmpty()) {

        a = artists.size();
    }
    else {

        a = 0;

     }

   return a;
}
2
user3277530

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

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

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

mmAdapter = new Adapter(msgList);
mrecyclerView.setAdapter(mmAdapter);
2
Mallikarjun Dodmani
ArtistArrayAdapter adapter = new ArtistArrayAdapter(this, artists);
recyclerView = (RecyclerView) findViewById(R.id.cardList);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapter);

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

1
Pradeep Bogati

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

Понравился этот код:

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
//}
1
mehdi janbarari

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

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

1
Vikash Sharma

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

1
saiyancoder

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

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.

1
Roger

У меня возникла та же проблема, и я понял, что после получения данных из моего источника я настраивал LayoutManage r и adaptor вместо того, чтобы устанавливать их в методе 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();
                    }
0
ovicko

Я потерял 16 минут своей жизни из-за этой проблемы, поэтому я просто признаю эту невероятно смущающую ошибку, которую я совершил: я использую 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

0
Saik Caskey

Для тех, кто использует 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);
    // rest ...
    return rootView;
}
0
N. Osil

В своем классе адаптера 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);
    }
   ....
0
Neil Agarwal

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

        <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>
0
Kingsley Mitchell

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

0
SpicyWeenie

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

В моем случае это произошло, потому что я встроил 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"/>

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

0
SoliQuiD

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

0
lomec

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

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

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

recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
0
Khalid Taha

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

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

Добавление еще одного ответа, так как я наткнулся на эту тему, погуглив ошибку. Я пытался инициализировать 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 для внутреннего использования.

0
aschmied