recyclerview Tidak ada adaptor yang terpasang; melewatkan tata letak

241

Baru diimplementasikan RecyclerViewdalam kode saya, ganti ListView.

Semuanya bekerja dengan baik. Data ditampilkan.

Tetapi pesan kesalahan sedang dicatat:

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

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

untuk kode berikut:

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

Seperti yang Anda lihat, saya telah memasang adaptor untuk RecyclerView. Jadi mengapa saya terus mendapatkan kesalahan ini?

Saya telah membaca pertanyaan lain yang berhubungan dengan masalah yang sama tetapi tidak ada yang membantu.

equitharn
sumber
apakah artis itu kosong? apa yang terjadi Anda beralih setAdapter dan setLayoutManager?
Blackbelt
Anda harus menggunakan RecyclerView.Adapter
Octopus38
12
Anda mungkin melihatnya jika Anda tidak menginisialisasi recyclerview segera setelah terpasang ke jendela.
yigit
1
@yigit Saya menunggu retrofit untuk mengunduh data dan setelah selesai kode berjalan!
equitharn
3
Seberapa seriuskah kesalahan ini? Bisakah ini diabaikan? Pokoknya saya menggunakan setAdapter (null) untuk menghindari kesalahan.
priyankvex

Jawaban:

243

Bisakah Anda memastikan bahwa Anda memanggil pernyataan ini dari utas "utama" (misalnya di dalam onCreate()metode). Segera setelah saya memanggil pernyataan yang sama dari metode "tertunda". Dalam kasus saya ResultCallback, saya mendapatkan pesan yang sama.

Di saya Fragment, memanggil kode di bawah ini dari dalam suatu ResultCallbackmetode menghasilkan pesan yang sama. Setelah memindahkan kode ke onConnected()metode dalam aplikasi saya, pesan itu hilang ...

LinearLayoutManager llm = new LinearLayoutManager(this);
llm.setOrientation(LinearLayoutManager.VERTICAL);
list.setLayoutManager(llm);
list.setAdapter( adapter );
Peter
sumber
9
Tetapi saya harus mengunduh data terlebih dahulu kemudian menampilkan!
equitharn
93
Cukup atur adaptor kosong terlebih dahulu, perbarui segera setelah Anda memiliki data (inilah yang berfungsi untuk saya).
Peter
3
Itu yang disarankan Yigit!
equitharn
13
@equitharn Anda harus mengatur adaptor kosong terlebih dahulu, dan kemudian data diunduh, hubungi mAdapter.notifyDataSetChanged (), yang berfungsi untuk saya.
DomonLee
2
Solusi ini tidak membantu saya. Sebenarnya tidak ada solusi di utas ini yang membantu saya. Bisakah seseorang melihat kasus saya di sini
Pulak
41

Saya mendapatkan dua pesan kesalahan yang sama sampai saya memperbaiki dua hal dalam kode saya:

(1) Secara default, ketika Anda mengimplementasikan metode di RecyclerView.Adapterdalamnya menghasilkan:

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

Pastikan Anda memperbarui kode Anda sehingga dikatakan:

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

Tentunya jika Anda memiliki item nol di item Anda maka Anda akan mendapatkan nol hal yang ditampilkan di layar.

(2) Saya tidak melakukan ini seperti yang ditunjukkan pada jawaban atas: CardView layout_width = "match_parent" tidak cocok dengan lebar induk 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: Pastikan juga Anda mengatur RecyclerViewseperti ini:

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

Tidak seperti ini:

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

Saya telah melihat beberapa tutorial menggunakan metode yang terakhir. Sementara itu berfungsi saya pikir ini menghasilkan kesalahan ini juga.

Mikro
sumber
1
getItemCount saya () terlihat seperti ini public int getItemCount() { return artists == null ? 0 : artists.size(); }dan LayoutInflaterView itemView = LayoutInflater. from(parent.getContext()).inflate(R.layout.fragment_listitem, parent, false);
equitharn
ini berfungsi untuk saya: @Override public int getItemCount () {return artists.size (); }
AstonCheah
4
Ya Tuhan. Saat itu ketika Anda kembali ke SO, dan melihat jawaban yang sudah Anda pilih, dan sadari bahwa Anda melakukan hal bodoh yang sama. Terima kasih lagi @Micro.
androidevil
20

Saya memiliki situasi yang sama dengan Anda, tampilan ok, tetapi kesalahan muncul di locat. Itu solusi saya: (1) Inisialisasi RecyclerView & bind adapter ON CREATE ()

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

(2) panggil notifyDataStateChanged ketika Anda mendapatkan data

adapter.notifyDataStateChanged();

Dalam kode sumber recyclerView, ada utas lain untuk memeriksa status 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();
                }

            }
        }
    };

Di dispatchLayout (), kami dapat menemukan ada kesalahan di dalamnya:

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

saya punya masalah ini, beberapa kali masalah adalah recycleView dimasukkan ke dalam objek ScrollView

Setelah memeriksa implementasi, alasannya muncul sebagai berikut. Jika RecyclerView dimasukkan ke dalam ScrollView, maka selama langkah pengukuran tingginya tidak ditentukan (karena ScrollView memungkinkan ketinggian apa pun) dan, akibatnya, mendapatkan sama dengan tinggi minimum (sesuai implementasi) yang ternyata nol.

Anda memiliki beberapa opsi untuk memperbaikinya:

  1. Atur ketinggian tertentu ke RecyclerView
  2. Set ScrollView.fillViewport menjadi true
  3. Atau simpan RecyclerView di luar ScrollView. Menurut saya, ini adalah pilihan terbaik sejauh ini. Jika tinggi RecyclerView tidak terbatas - yang merupakan kasus ketika dimasukkan ke ScrollView - maka semua tampilan Adaptor memiliki tempat yang cukup secara vertikal dan dapat dibuat sekaligus. Tidak ada daur ulang tampilan lagi yang agak merusak tujuan RecyclerView.

(Dapat diikuti android.support.v4.widget.NestedScrollViewjuga)

FxRi4
sumber
pengaturan ScrollView.fillViewport ke true menyelesaikan masalah saya, terima kasih banyak
Eman
10

1) Buat ViewHolder yang tidak melakukan apa-apa :)

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

2) Sekali lagi buat RecyclerView yang tidak melakukan apa-apa :)

// 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) Sekarang ketika pendaur ulang nyata Anda belum siap, gunakan sampel yang seperti di bawah ini.

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

Meskipun ini bukan solusi terbaik tetapi berhasil! Semoga ini bisa membantu.

Madan Sapkota
sumber
Hai, tolong saya memiliki kesalahan yang sama dan saya tidak tahu di mana saya harus memeriksa apakah recycler tidak siap untuk melewati adaptor kosong) dan di mana saya dapat memeriksa apakah recycler siap (untuk lulus adaptor dengan data)
James
Ini luar biasa, inilah inti gaya drag 'n drop gist gith.github.com/anonymous/bcf027945f08f40601090c55d6048e21
nmu
9

Ini terjadi ketika Anda tidak mengatur adaptor selama fase pembuatan:

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

Cukup pindahkan pengaturan adaptor ke onCreate dengan data kosong dan ketika Anda memiliki panggilan data:

mAdapter.notifyDataSetChanged();
Peter File
sumber
pastikan Anda mengatur data dalam konstruktor customadapter dalam metode onCreate
Mohit Singh
4

Periksa apakah Anda tidak dapat memanggil metode ini di adaptor Anda

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

Pastikan Anda mengatur manajer tata letak untuk RecyclerView Anda dengan:

mRecyclerView.setLayoutManager(new LinearLayoutManager(context));

Alih-alih LinearLayoutManager, Anda juga dapat menggunakan pengelola tata letak lainnya .

Sumit Jha
sumber
3

Saya memiliki kesalahan yang sama dengan saya memperbaikinya dengan melakukan ini jika Anda menunggu data seperti saya menggunakan retrofit atau sesuatu seperti itu

Letakkan di depan Oncreate

private ArtistArrayAdapter adapter;
private RecyclerView recyclerView;

Tempatkan mereka di Oncreate Anda

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

Ketika Anda menerima data put

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

Sekarang masuklah ke kelas ArtistArrayAdapter Anda dan lakukan ini apa yang akan dilakukannya adalah jika array Anda kosong atau null akan membuat GetItemCount mengembalikan 0 jika tidak, itu akan membuat ukuran array artis

@Override
public int getItemCount() {

    int a ;

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

        a = artists.size();
    }
    else {

        a = 0;

     }

   return a;
}
pengguna3277530
sumber
3

Baris ini harus dalam OnCreate:

mmAdapter = new Adapter(msgList);
mrecyclerView.setAdapter(mmAdapter);
Mallikarjun Dodmani
sumber
2

Ini terjadi karena tata letak yang sebenarnya meningkat berbeda dari yang sedang Anda rujuk saat menemukan recyclerView. Secara default saat Anda membuat fragmen, metode onCreateView muncul sebagai berikut: return inflater.inflate(R.layout.<related layout>,container.false);

Alih-alih itu, buat secara terpisah tampilan dan gunakan itu untuk merujuk ke recyclerView View view= inflater.inflate(R.layout.<related layout>,container.false); recyclerview=view.findViewById(R.id.<recyclerView ID>); return view;

Prateek Agarwal
sumber
2

Pertama-tama inisialisasi adaptor

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

Ketika ada perubahan dalam set dataset, panggil saja metode updateComments.

Roger
sumber
2

Bagi mereka yang menggunakan bagian RecyclerViewdalam fragmen dan mengembangnya dari tampilan lain: ketika menggembungkan seluruh tampilan fragmen, pastikan bahwa Anda mengikatnya RecyclerViewke tampilan root.

Saya menghubungkan dan melakukan segalanya untuk adaptor dengan benar, tetapi saya tidak pernah melakukan pengikatan. Jawaban ini oleh @Prateek Agarwal memiliki semuanya untuk saya, tetapi di sini lebih rinci.

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
sumber
1
ArtistArrayAdapter adapter = new ArtistArrayAdapter(this, artists);
recyclerView = (RecyclerView) findViewById(R.id.cardList);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapter);

Cukup ganti kode di atas dengan ini dan itu akan berfungsi. Apa yang Anda lakukan salah adalah Anda memanggil setAdapter (adaptor) sebelum memanggil manajer tata letak.

Pradeep Bogati
sumber
1

Ini benar-benar kesalahan sederhana yang Anda dapatkan, tidak perlu melakukan kode apa pun dalam hal ini. Kesalahan ini terjadi karena file tata letak yang salah digunakan oleh aktivitas. Dengan IDE saya secara otomatis membuat tata letak v21 dari tata letak yang menjadi tata letak default aktivitas. semua kode yang saya lakukan di file tata letak lama dan yang baru hanya memiliki beberapa kode xml, yang menyebabkan kesalahan itu.

Solusi: Salin semua kode tata letak lama dan tempel di tata letak v 21

Vikash Sharma
sumber
1

Dalam kasus saya, saya mengatur adaptor di dalam onLocationChanged()callback DAN debugging di emulator. Karena tidak mendeteksi perubahan lokasi, ia tidak pernah dipecat. Ketika saya mengaturnya secara manual di kontrol Extended dari emulator itu berfungsi seperti yang diharapkan.

saiyancoder
sumber
1

Saya telah memecahkan kesalahan ini. Anda hanya perlu menambahkan manajer tata letak dan menambahkan adaptor kosong.

Seperti kode ini:

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
sumber
1
saya melakukannya untuk pengguna pemula
mehdi janbarari
1

Cukup tambahkan berikut ini ke RecyclerView

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

Contoh:

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

Saya memiliki kesalahan ini, dan saya mencoba untuk memperbaikinya sampai saya menemukan solusinya.

Saya membuat metode pribadi buildRecyclerView, dan saya menyebutnya dua kali, pertama di onCreateView dan kemudian setelah panggilan balik saya (di mana saya mengambil data dari API). Ini adalah metode saya buildRecyclerView di Fragmen saya:

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

Selain itu, saya harus memodifikasi metode get-Item-Count di adaptor saya, karena On on-Create-View daftar adalah nol dan melalui kesalahan. Jadi, get-Item-Count saya adalah sebagai berikut:

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

    }
Zeke
sumber
0

Dalam situasi saya itu adalah komponen yang terlupakan yang terletak di kelas ViewHolder tetapi tidak terletak di file layout

lomec
sumber
0

Saya memiliki masalah yang sama dan menyadari bahwa saya sedang mengatur baik LayoutManage r dan adaptor setelah mengambil data dari sumber saya alih-alih mengatur keduanya dalam metode onCreate .

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

Kemudian memberitahu adaptor tentang perubahan data

               //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
sumber
0

Masalah ini karena Anda tidak menambahkan apa pun LayoutManageruntuk RecyclerView.

Alasan lain adalah karena Anda memanggil kode ini dalam NonUIThread. Pastikan untuk memanggil panggilan ini di UIThread.

Solusinya hanya Anda harus menambahkan LayoutManageruntuk RecyclerViewsebelum Anda setAdapterdi Thread UI.

recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
Khalid Taha
sumber
Jika Anda perlu menunda pengaturan LayoutManager Anda harus melakukan ini dari metode panggilan balik Anda: recyclerView.post (() -> {recyclerView.setLayoutManager (mGridLayoutManager); recyclerView.addItemDecoration (ItemOffsetDecoration baru (itemGap));});
ievgen
0

Masalah saya adalah tampilan pendaur ulang saya terlihat seperti ini

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

Padahal seharusnya terlihat seperti ini

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

Di RecyclerViewkelas adaptor Anda , misalnya MyRecyclerViewAdapter, buat konstruktor dengan params berikut.

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

mDataadalah data yang akan Anda sampaikan ke adaptor. Ini opsional jika Anda tidak memiliki data untuk dikirimkan. mInflateradalah LayoutInflaterobjek yang telah Anda buat dan Anda gunakan dalam OnCreateViewHolderfungsi adaptor.

Setelah ini, Anda memasang adaptor di MainActivity atau di mana pun Anda ingin berada di utas utama / UI dengan benar

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

Dipecahkan dengan mengatur daftar kosong yang diinisialisasi dan adaptor di bagian bawah dan memanggil notifyDataSetChanged ketika hasilnya diambil.

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

Saya kehilangan 16 menit hidup saya dengan masalah ini, jadi saya akan mengakui kesalahan memalukan yang saya buat ini - saya menggunakan Butterknife dan saya mengikat tampilan di onCreateView dalam fragmen ini.

Butuh waktu lama untuk mencari tahu mengapa saya tidak memiliki layoutmanager - tetapi jelas pandangan disuntikkan sehingga mereka tidak akan benar-benar nol, sehingga pendaur ulang tidak akan pernah menjadi nol .. wah!

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

Jika Anda mendapatkan masalah seperti ini lacak pandangan Anda dan gunakan sesuatu seperti uiautomatorviewer

Saik Caskey
sumber
0

Tidak banyak jawaban tetapi saya memiliki masalah yang sama juga bahkan dengan kode yang benar. Kadang-kadang, itu hanya yang paling sederhana. Dalam hal ini, kesalahan OP juga bisa hilang <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />dari Manifest, yang mereproduksi kesalahan yang sama.

SpicyWeenie
sumber
0

Dalam kasus saya itu terjadi karena saya menyematkan RecyclerView di LinearLayout.

Saya sebelumnya memiliki file layout hanya berisi satu root RecyclerView sebagai berikut

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

Saya percaya masalahnya adalah dalam 3 garis yang terpisah. Bagaimanapun, saya pikir ini masalah sederhana, saya tidak akan mengerjakannya besok; pikir saya harus menulis apa yang saya temukan sebelum lupa tentang utas ini.

SoliQuiD
sumber
0

Menambahkan jawaban lain sejak saya menemukan utas ini tentang kesalahan Google. Saya mencoba untuk menginisialisasi PreferenceFragmentCompattetapi saya lupa untuk mengembang XML preferensi dalam onCreatePreferencesseperti ini:

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

Kesalahan adalah misteri sampai saya menyadari bahwa PreferenceFragmentCompatharus menggunakan RecyclerViewinternal.

aschmied
sumber
0

// Ini terjadi ketika engkau bukan adaptor selama tahap pembuatan: panggilan notifyDataSetChanged () ketika respon api semakin Kerja Its

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