Μόλις υλοποιήθηκε η Recyclerview στον κώδικά μου, αντικαθιστώντας την Listview.
όλα λειτουργούν μια χαρά. Τα αντικείμενα εμφανίζονται.
αλλά το logcat λέει
15:25:53.476 E/RecyclerView﹕ No adapter attached; skipping layout
15:25:53.655 E/RecyclerView﹕ No adapter attached; skipping layout
για τον κώδικα
ArtistArrayAdapter adapter = new ArtistArrayAdapter(this, artists);
recyclerView = (RecyclerView) findViewById(R.id.cardList);
recyclerView.setHasFixedSize(true);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
Όπως μπορείτε να δείτε έχω επισυνάψει έναν προσαρμογέα για το Recycleview. Γιατί λοιπόν συνεχίζω να λαμβάνω αυτό το σφάλμα;
έχω διαβάσει άλλες ερωτήσεις που σχετίζονται με το ίδιο πρόβλημα, αλλά καμία δεν βοηθάει.
Μπορείτε να βεβαιωθείτε ότι καλείτε αυτές τις δηλώσεις από το νήμα "main" (για παράδειγμα μέσα στη μέθοδο onCreate()
).
Μόλις καλέσω τις ίδιες δηλώσεις από μια "καθυστερημένη" μέθοδο. Στην περίπτωσή μου μια ResultCallback
, λαμβάνω το ίδιο μήνυμα.
Στο δικό μου Fragment
, η κλήση του παρακάτω κώδικα μέσα από μια μέθοδο ResultCallback
παράγει το ίδιο μήνυμα. Μετά τη μετακίνηση του κώδικα στη μέθοδο onConnected()
μέσα στην εφαρμογή μου, το μήνυμα εξαφανίστηκε...
LinearLayoutManager llm = new LinearLayoutManager(this);
llm.setOrientation(LinearLayoutManager.VERTICAL);
list.setLayoutManager(llm);
list.setAdapter( adapter );
Έπαιρνα τα ίδια δύο μηνύματα σφάλματος μέχρι που διόρθωσα δύο πράγματα στον κώδικά μου:
(1) Από προεπιλογή, όταν υλοποιείτε μεθόδους στο RecyclerView.Adapter
παράγει:
@Override
public int getItemCount() {
return 0;
}
Βεβαιωθείτε ότι έχετε ενημερώσει τον κώδικά σας ώστε να λέει:
@Override
public int getItemCount() {
return artists.size();
}
Προφανώς, αν έχετε μηδέν αντικείμενα στα αντικείμενα σας, τότε θα εμφανιστούν μηδέν πράγματα στην οθόνη.
(2) Δεν το έκανα αυτό όπως φαίνεται στην κορυφαία απάντηση: https://stackoverflow.com/questions/24503760/cardview-layout-width-match-parent-does-not-match-parent-recyclerview-width
//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" />
Έχω δει κάποια σεμινάρια που χρησιμοποιούν την τελευταία μέθοδο. Ενώ λειτουργεί νομίζω ότι παράγει και αυτό το σφάλμα.
Συμβαίνει όταν δεν ρυθμίζετε τον προσαρμογέα κατά τη φάση δημιουργίας:
@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();