recyclinglerview Nie podłączono adaptera; pomijanie układu

241

Właśnie zaimplementowano RecyclerVieww moim kodzie, zastępując ListView.

Wszystko dziala. Dane są wyświetlane.

Ale komunikaty o błędach są rejestrowane:

15:25:53.476 E/RecyclerView: No adapter attached; skipping layout

15:25:53.655 E/RecyclerView: No adapter attached; skipping layout

dla następującego kodu:

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

Jak widać, dołączyłem adapter RecyclerView. Dlaczego więc ciągle pojawia się ten błąd?

Przeczytałem inne pytania związane z tym samym problemem, ale żadne z nich nie pomaga.

equitharn
źródło
czy artyści są puści? co się stanie, przełączysz setAdapter i setLayoutManager?
Blackbelt
Musisz użyć RecyclerView.Adapter
Octopus38
12
Możesz to zobaczyć, jeśli nie inicjujesz widoku programu recyklingowego, gdy tylko zostanie on dołączony do okna.
yigit
1
@yigit Czekam na aktualizację, aby pobrać dane, a po jej zakończeniu kod działa!
equitharn
3
Jak poważny jest ten błąd? Czy można to zignorować? W każdym razie używam setAdapter (null), aby uniknąć błędu.
priyankvex

Odpowiedzi:

243

Czy możesz się upewnić, że wywołujesz te instrukcje z „głównego” wątku (na przykład w onCreate()metodzie). Jak tylko wywołam te same stwierdzenia z metody „opóźnionej”. W moim przypadku a ResultCallbackdostaję tę samą wiadomość.

W moim przypadku Fragmentwywołanie poniższego kodu z ResultCallbackmetody powoduje wygenerowanie tego samego komunikatu. Po przeniesieniu kodu do onConnected()metody w mojej aplikacji wiadomość zniknęła ...

LinearLayoutManager llm = new LinearLayoutManager(this);
llm.setOrientation(LinearLayoutManager.VERTICAL);
list.setLayoutManager(llm);
list.setAdapter( adapter );
Piotr
źródło
9
Ale najpierw muszę pobrać dane, a następnie wyświetlić!
equitharn
93
Najpierw ustaw pusty adapter, zaktualizuj go, gdy tylko będziesz mieć dane (to działa dla mnie).
Peter
3
Tak sugerował Yigit!
equitharn
13
@equitharn Najpierw należy ustawić pusty adapter, a następnie pobrać dane, wywołać mAdapter.notifyDataSetChanged (), który jest dla mnie odpowiedni.
DomonLee
2
To rozwiązanie mi nie pomaga. W rzeczywistości żadne rozwiązanie w tym wątku mi nie pomaga. Czy ktoś mógłby spojrzeć w moim przypadku tutaj
Pulak
41

Otrzymywałem te same dwa komunikaty o błędach, dopóki nie naprawiłem dwóch rzeczy w kodzie:

(1) Domyślnie, gdy zaimplementujesz metody RecyclerView.Adapter, generuje:

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

Zaktualizuj kod, aby zawierał:

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

Oczywiście, jeśli masz zero przedmiotów w swoich przedmiotach, wtedy zero rzeczy wyświetli się na ekranie.

(2) Nie robiłem tego, jak pokazano w górnej odpowiedzi: CardView layout_width = "match_parent" nie pasuje do nadrzędnej szerokości 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) EDYCJA: BONUS: Upewnij się również, że skonfigurowałeś RecyclerViewtak:

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

Nie tak jak to:

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

Widziałem kilka samouczków wykorzystujących tę drugą metodę. Chociaż działa, myślę, że generuje również ten błąd.

Micro
źródło
1
moja metoda getItemCount () wygląda tak public int getItemCount() { return artists == null ? 0 : artists.size(); }i LayoutInflaterView itemView = LayoutInflater. from(parent.getContext()).inflate(R.layout.fragment_listitem, parent, false);
equitharn
to działa dla mnie: @Override public int getItemCount () {return artist.size (); }
AstonCheah,
4
O Boże. Ten moment, kiedy wracasz do SO i widzisz odpowiedź, którą już głosowałeś, i zdajesz sobie sprawę, że robisz to samo głupie. Jeszcze raz dziękuję @Micro.
androidevil,
20

Mam z tobą tę samą sytuację, wyświetlanie jest w porządku, ale błąd pojawia się w lokalizacji. To jest moje rozwiązanie: (1) Zainicjuj RecyclerView & bind adapter NA UTWÓRZ ()

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

(2) wywołaj powiadomienie DataStateChanged po otrzymaniu danych

adapter.notifyDataStateChanged();

W kodzie źródłowym recyclinglerView jest inny wątek do sprawdzania stanu danych.

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

            }
        }
    };

W dispatchLayout () możemy znaleźć błąd:

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 {
Keith Gong
źródło
11

Mam ten problem, problem z kilkoma razami jest recycleView umieszczony w obiekcie ScrollView

Po sprawdzeniu implementacji wydaje się, że jest to następujący powód. Jeśli RecyclerView zostanie umieszczony w ScrollView, wówczas podczas kroku pomiaru jego wysokość jest nieokreślona (ponieważ ScrollView dopuszcza dowolną wysokość), w wyniku czego staje się równa minimalnej wysokości (zgodnie z implementacją), która najwyraźniej wynosi zero.

Masz kilka opcji, aby to naprawić:

  1. Ustaw określoną wysokość na RecyclerView
  2. Ustaw ScrollView.fillViewport na true
  3. Lub trzymaj RecyclerView poza ScrollView. Moim zdaniem jest to zdecydowanie najlepsza opcja. Jeśli wysokość RecyclerView nie jest ograniczona - co ma miejsce w przypadku umieszczenia jej w ScrollView - wszystkie widoki adaptera mają wystarczająco dużo miejsca w pionie i zostają utworzone naraz. Nie ma już recyklingu widoków, który w pewnym sensie narusza cel RecyclerView.

(Można również śledzić android.support.v4.widget.NestedScrollView)

FxRi4
źródło
ustawienie ScrollView.fillViewport na true rozwiązało mój problem, dziękuję
Eman
10

1) Utwórz ViewHolder , który nic nie robi :)

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

2) Ponownie utwórz RecyclerView , który nic nie robi :)

// 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) Teraz, gdy twój prawdziwy recykler nie jest gotowy, po prostu użyj próbki takiej jak poniżej.

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

Nie jest to jednak najlepsze rozwiązanie, ale działa! Mam nadzieję, że to jest pomocne.

Madan Sapkota
źródło
Cześć, proszę, mam ten sam błąd i nie wiem, gdzie powinienem sprawdzić, czy recykler nie jest gotowy, aby przekazać pusty adapter) i gdzie mogę sprawdzić, czy recykler jest gotowy (przekazać adapter z danymi)
James
To jest świetne, oto stylistyka typu drag'n drop gist.github.com/anonymous/bcf027945f08f40601090c55d6048e21
nmu
9

Dzieje się tak, gdy adapter nie jest ustawiany podczas fazy tworzenia:

@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);
    ....
}

Po prostu przenieś ustawienie adaptera do onCreate z pustymi danymi, a kiedy masz połączenie danych:

mAdapter.notifyDataSetChanged();
Peter File
źródło
upewnij się, że ustawiłeś dane w kreatorze customadapter w ramach metody onCreate
Mohit Singh
4

Sprawdź, czy nie udało Ci się wywołać tej metody w adapterze

@Override
public int getItemCount() {
    return list.size();
}
Shabbir Ahmed
źródło
3

Upewnij się, że ustawiłeś menedżera układu dla RecyclerView przez:

mRecyclerView.setLayoutManager(new LinearLayoutManager(context));

Zamiast tego LinearLayoutManagermożesz użyć także innych menedżerów układu.

Sumit Jha
źródło
3

Miałem ten sam błąd, który naprawiłem, robiąc to, jeśli czekasz na dane takie jak ja za pomocą modernizacji lub czegoś takiego

Umieść przed Oncreate

private ArtistArrayAdapter adapter;
private RecyclerView recyclerView;

Umieść je w swoim 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);

Po otrzymaniu danych umieścić

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

Teraz przejdź do klasy ArtistArrayAdapter i zrób to, co zrobi, jeśli twoja tablica jest pusta lub ma wartość zerową, spowoduje to, że GetItemCount zwróci 0, jeśli nie, sprawi, że będzie ona wielkości tablicy artystów

@Override
public int getItemCount() {

    int a ;

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

        a = artists.size();
    }
    else {

        a = 0;

     }

   return a;
}
użytkownik3277530
źródło
3

Te linie muszą znajdować się w OnCreate:

mmAdapter = new Adapter(msgList);
mrecyclerView.setAdapter(mmAdapter);
Mallikarjun Dodmani
źródło
2

Dzieje się tak, ponieważ faktyczny napompowany układ różni się od tego, który został wskazany przez Ciebie podczas wyszukiwania programu recyclinglerView. Domyślnie podczas tworzenia fragmentu metoda onCreateView wygląda następująco: return inflater.inflate(R.layout.<related layout>,container.false);

Zamiast tego osobno utwórz widok i użyj go, aby odnieść się do recyclinglerView View view= inflater.inflate(R.layout.<related layout>,container.false); recyclerview=view.findViewById(R.id.<recyclerView ID>); return view;

Prateek Agarwal
źródło
2

Najpierw zainicjuj adapter

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

Kiedykolwiek nastąpi zmiana w zestawie danych, wystarczy wywołać metodę updateComments.

zrozumiałem
źródło
2

Dla tych, którzy korzystają z RecyclerViewwewnątrz fragmentu i napompować go od innych poglądów: podczas pompowania cały widok fragmentu, upewnij się, że wiązało RecyclerViewsię jego zdaniem głównym.

Łączę się i robię wszystko dla adaptera poprawnie, ale nigdy nie zrobiłem wiązania. Ta odpowiedź przez @Prateek Agarwal ma to wszystko dla mnie, ale tutaj jest bardziej opracowanie.

Kotlin

    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
}

Jawa

  @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;
}
N. Osil
źródło
1
ArtistArrayAdapter adapter = new ArtistArrayAdapter(this, artists);
recyclerView = (RecyclerView) findViewById(R.id.cardList);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapter);

Po prostu zamień powyższy kod na ten i powinno działać. To, co zrobiłeś źle, to nazwa zestawu (Adaptor) przed wywołaniem menedżera układu.

Pradeep Bogati
źródło
1

To jest naprawdę prosty błąd, który się pojawia, nie ma potrzeby wykonywania żadnych kodów w tym. Ten błąd występuje z powodu niewłaściwego pliku układu używanego przez działanie. Przez IDE automatycznie utworzyłem układ v21 układu, który stał się domyślnym układem działania. wszystkie kody, które zrobiłem w starym pliku układu, a nowy miał tylko kilka kodów xml, co doprowadziło do tego błędu.

Rozwiązanie: Skopiuj wszystkie kody starego układu i wklej w układzie v 21

Vikash Sharma
źródło
1

W moim przypadku ustawiałem adapter w onLocationChanged()wywołaniu zwrotnym ORAZ debugowałem w emulatorze. Ponieważ nie wykrył zmiany lokalizacji, nigdy nie został uruchomiony. Kiedy ustawiłem je ręcznie w rozszerzonych kontrolkach emulatora, działało to zgodnie z oczekiwaniami.

saiyancoder
źródło
1

Rozwiązałem ten błąd. Wystarczy dodać menedżera układu i dodać pusty adapter.

Podobnie jak ten kod:

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
//}
mehdi janbarari
źródło
1
robię to dla początkujących użytkowników
mehdi janbarari
1

Po prostu dodaj do RecyclerView

app:layoutManager="android.support.v7.widget.LinearLayoutManager"

Przykład:

   <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>
Alan Deep
źródło
1

Miałem ten błąd i próbowałem go naprawić, dopóki nie znalazłem rozwiązania.

Zrobiłem prywatną metodę buildRecyclerView i wywołałem ją dwukrotnie, najpierw w onCreateView, a następnie po moim wywołaniu zwrotnym (w którym pobieram dane z API). To jest moja metoda buildRecyclerView w moim fragmencie:

private void buildRecyclerView(View v) {
        mRecyclerView = v.findViewById(R.id.recycler_view_loan);
        mLayoutManager = new LinearLayoutManager(getActivity());
        ((LinearLayoutManager) mLayoutManager).setOrientation(LinearLayoutManager.VERTICAL);
        mRecyclerView.setLayoutManager(mLayoutManager);
        mAdapter = new LoanAdapter(mExampleList);
        mRecyclerView.setLayoutManager(mLayoutManager);
        mRecyclerView.setAdapter(mAdapter);
}

Poza tym muszę zmodyfikować metodę get-Item-Count w moim adapterze, ponieważ w momencie tworzenia na liście lista jest pusta i pojawia się błąd. Tak więc mój get-item-count jest następujący:

@Override
    public int getItemCount() {
        try {
            return mLoanList.size();
        } catch (Exception ex){return 0;}

    }
Zeke
źródło
0

W mojej sytuacji był to zapomniany komponent, który lokalizuje się w klasie ViewHolder, ale nie został umieszczony w pliku układu

Lomec
źródło
0

Miałem ten sam problem i zdałem sobie sprawę, że ustawiałem zarówno LayoutManage r, jak i adapter po pobraniu danych z mojego źródła zamiast ustawiania dwóch w metodzie onCreate .

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

Następnie powiadomił adapter o zmianie danych

               //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();
                    }
ovicko
źródło
0

Ten problem jest, ponieważ nie jesteś dodając dowolny LayoutManagerdla twojego RecyclerView.

Innym powodem jest to, że wywołujesz ten kod w NonUIThread. Pamiętaj, aby wywołać to połączenie w UIThread.

Rozwiązaniem jest tylko to, że musisz dodać znak LayoutManagerRecyclerViewprzed” setAdapterw wątku interfejsu użytkownika.

recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
Khalid Taha
źródło
Jeśli musisz opóźnić ustawienie LayoutManager, powinieneś to zrobić za pomocą metody wywołania zwrotnego: recyclinglerView.post (() -> {recyclinglerView.setLayoutManager (mGridLayoutManager); recyclinglerView.addItemDecoration (nowy ItemOffsetDecoration (itemGap));});
ievgen,
0

Mój problem polegał na tym, że mój widok recyklera wyglądał tak

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

Kiedy powinno tak wyglądać

       <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>
Kingsley Mitchell
źródło
0

Na RecyclerViewprzykład w klasie adaptera MyRecyclerViewAdapterutwórz konstruktor o następujących parametrach.

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

mDatato dane, które prześlesz do adaptera. Jest to opcjonalne, jeśli nie masz danych do przekazania. mInflaterto LayoutInflaterobiekt, który utworzyłeś i którego używasz w OnCreateViewHolderfunkcji adaptera.

Następnie podłącz adapter w MainActivity lub gdziekolwiek chcesz w wątku main / UI, tak jak chcesz

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);
    }
   ....
Neil Agarwal
źródło
0

Rozwiązany przez ustawienie zainicjowanej pustej listy i adaptera na dole i wywołanie powiadomieniaDataSetChanged podczas pobierania wyników.

    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
    recyclerviewItems.setLayoutManager(linearLayoutManager);
    someAdapter = new SomeAdapter(getContext(),feedList);
    recyclerviewItems.setAdapter(someAdapter);
Tabraiz Malik
źródło
0

Straciłem 16 minut swojego życia z tym problemem, więc po prostu przyznam się do tego niezwykle żenującego błędu, który popełniłem - używam Butterknife i łączę widok w onCreateView w tym fragmencie.

Długo trwało ustalenie, dlaczego nie miałem menedżera układu - ale oczywiście widoki są wstrzykiwane, więc nie będą miały wartości zerowej, więc recykler nigdy nie będzie zerowy.

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

Jeśli pojawia się taki problem, śledź swój widok i użyj czegoś podobnego uiautomatorviewer

Saik Caskey
źródło
0

Niewiele odpowiedzi, ale miałem ten sam problem, nawet przy poprawnym kodzie. Czasami jest to tylko najprostsza marka. W takim przypadku błąd OP może również brakować <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />w Manifeście, który odtwarza ten sam błąd.

SpicyWeenie
źródło
0

W moim przypadku stało się tak, ponieważ osadziłem RecyclerView w LinearLayout.

Wcześniej miałem plik układu zawierający tylko jeden główny RecyclerView w następujący sposób

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

Uważam, że problem dotyczy 3 oddzielnych linii. W każdym razie uważam, że to prosty problem, nie będę pracował nad tym jutro; pomyślałem, że powinienem napisać to, co znalazłem, zanim zapomnę o tym wątku.

SoliQuiD
źródło
0

Dodanie jeszcze jednej odpowiedzi, odkąd natknąłem się na ten wątek, przeglądając błąd. Próbowałem zainicjować plik A, PreferenceFragmentCompatale zapomniałem zawęzić preferencje XML w onCreatePreferencesnastępujący sposób:

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

Błąd był tajemnicą, dopóki nie zdałem sobie sprawy, że PreferenceFragmentCompattrzeba używać RecyclerViewwewnętrznie.

aschmied
źródło
0

// To się dzieje, gdy nie są ustalone adapter podczas fazy tworzenia call notifyDataSetChanged (), gdy odpowiedź API jest uzyskanie jego pracy

@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();
Keshav Gera
źródło