recyclerview No adapter attached; skipping layout

后端 未结 30 2935
走了就别回头了
走了就别回头了 2020-11-21 04:51

Just implemented RecyclerView in my code, replacing ListView.

Everything works fine. The data is displayed.

But error messages are

相关标签:
30条回答
  • 2020-11-21 05:29

    I had the same error I fixed it doing this if you are waiting for data like me using retrofit or something like that

    Put before Oncreate

    private ArtistArrayAdapter adapter;
    private RecyclerView recyclerView;
    

    Put them in your 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);
    

    When you receive data put

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

    Now go in your ArtistArrayAdapter class and do this what it will do is if your array is empty or is null it will make GetItemCount return 0 if not it will make it the size of artists array

    @Override
    public int getItemCount() {
    
        int a ;
    
        if(artists != null && !artists.isEmpty()) {
    
            a = artists.size();
        }
        else {
    
            a = 0;
    
         }
    
       return a;
    }
    
    0 讨论(0)
  • 2020-11-21 05:29

    In Kotlin we had this weird illogical issue.

    This didn't work:

     mBinding.serviceProviderCertificates.apply {
                adapter = adapter
                layoutManager =  LinearLayoutManager(activity)
            }
    

    While this worked:

    mBinding.serviceProviderCertificates.adapter = adapter
    mBinding.serviceProviderCertificates.layoutManager = LinearLayoutManager(activity)
    

    Once I get more after work hours, I will share more insights.

    0 讨论(0)
  • 2020-11-21 05:30

    I have the same situation with you, display is ok, but error appear in the locat. That's my solution: (1) Initialize the RecyclerView & bind adapter ON CREATE()

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

    (2) call notifyDataStateChanged when you get the data

    adapter.notifyDataStateChanged();
    

    In the recyclerView's source code, there is other thread to check the state of data.

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

    In the dispatchLayout(), we can find there is the error in it:

    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 {
    
    0 讨论(0)
  • 2020-11-21 05:30

    I had the same problem and realized I was setting both the LayoutManager and adapter after retrieving the data from my source instead of setting the two in the onCreate method.

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

    Then notified the adapter on data change

                   //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 讨论(0)
  • 2020-11-21 05:30

    My problem was my recycler view looked like this

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

    When it should have looked like this

           <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 讨论(0)
  • 2020-11-21 05:30

    In my case it happened cause i embedded a RecyclerView in a LinearLayout.

    I previously had a layout file only containing one root RecyclerView as follows

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

    I believe the problem is within the 3 lines separated. Anyway, I think its a simple problem, ill be working on it tomorrow; thought i should write what i found before forgetting about this thread.

    0 讨论(0)
提交回复
热议问题