Mój RecyclerView
nie wywołuje onCreateViewHolder
, onBindViewHolder
nawet MenuViewHolder
konstruktora, dlatego nic nie pojawia się w RecyclerView
. Umieszczam dzienniki do debugowania i żaden dziennik nie jest wyświetlany. Co może być problemem?
Mój adapter:
public class MenuAdapter extends RecyclerView.Adapter<MenuAdapter.MenuViewHolder> {
private LayoutInflater inflater;
List<Menu> data = Collections.emptyList();
public MenuAdapter(Context context, List<Menu> data) {
Log.i("DEBUG", "Constructor");
inflater = LayoutInflater.from(context);
Log.i("DEBUG MENU - CONSTRUCTOR", inflater.toString());
this.data = data;
for(Menu menu: this.data){
Log.i("DEBUG MENU - CONSTRUCTOR", menu.menu);
}
}
@Override
public MenuViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.row_menu, parent, false);
MenuViewHolder holder = new MenuViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(MenuViewHolder holder, int position) {
Log.i("DEBUG MENU", "onBindViewHolder");
Menu current = data.get(position);
holder.title.setText(current.menu);
}
@Override
public int getItemCount() {
return 0;
}
class MenuViewHolder extends RecyclerView.ViewHolder {
TextView title;
ImageView icon;
public MenuViewHolder(View itemView) {
super(itemView);
title = (TextView) itemView.findViewById(R.id.menuText);
}
}
Mój niestandardowy wiersz XML:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/menuText"
android:text="Dummy Text"
android:layout_gravity="center_vertical"
android:textColor="#222"/>
i mój fragment:
public NavigationFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mUserLearnedDrawer = Boolean.valueOf(readFromPreferences(getActivity(), KEY_USER_LEARNED_DRAWER, "false"));
if (savedInstanceState != null) {
mFromSavedInstaceState = true;
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_navigation, container, false);
RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.drawer_list);
MenuAdapter adapter = new MenuAdapter(getActivity(), getData());
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
recyclerView.setAdapter(adapter);
return view;
}
java
android
android-recyclerview
Malinosqui
źródło
źródło
Odpowiedzi:
Twoja
getItemCount
metodareturns 0
. DlategoRecyclerView
nigdy nie próbuj tworzyć instancji widoku. Niech coś zwrócigreater than 0
.na przykład
źródło
Kolejnym jest upewnienie się, że ustawiłeś menedżera układu na RecyclerView:
źródło
Zapomniałem dodać poniższy wiersz po dodaniu, które zadziałało
źródło
Nie dotyczy to twojego konkretnego przypadku. Ale to może pomóc komuś innemu.
Przyczyną może być nieostrożne użycie następującej metody
Jeśli nie jest używany ostrożnie, może to spowodować, że
onBindView
andonCreateViewHolder
nie będzie w ogóle wywoływany, bez błędów w dziennikach.źródło
Ustaw menedżera układu na
RecyclerView
taki jak poniższy kod:źródło
Co jest warte, zauważyłem to, kiedy ustawiłem adapter widoku recyklera, zanim adapter został faktycznie zainicjowany. Rozwiązaniem było upewnienie się, że
recyclerView.setAdapter(adapter)
został wywołany z niepustym adapteremźródło
Naprawdę naprawdę nadzieję, że to pomoże ktoś kiedyś. Właśnie spędziłem ponad godzinę na tym, żeby oszaleć!
Miałem to:
Kiedy powinienem był to mieć:
Ponieważ głupio zadzwoniłem do mojego adaptera
adapter
, był on zasłaniany przez adapter widoku recyklera w bloku stosowania! Zmieniłem nazwę adaptera na projectAdapter, aby go odróżnić i problem został rozwiązany!źródło
Ustawienie wysokości
TextView
wcustom.xml
lubRecyclerView
. Jeśli wysokość towrap-content
,RecyclerView
ikona nie będzie widoczna.źródło
Stało się tak, gdy mój
RecyclerView
był w środku aScrollView
i korzystałem z biblioteki obsługi systemu Android 23.0. Aby to naprawić, zaktualizowałem do Android Support Library 23.2:W build.gradle:
źródło
Dodaj to do swojej klasy adaptera
źródło
Może to komuś pomoże, ale jeśli ustawisz widoczność RecycleView na GONE, metody adaptera nie zostaną w ogóle wywołane ... Zajęło mi trochę czasu, aby to zrozumieć.
źródło
Miałem ten sam problem, ponieważ korzystałem
android.support.constraint.ConstraintLayout
z zasobów układu. Zmiana naFrameLayout
pomoc.źródło
android.support.constraint.ConstraintLayout
?Inną opcją jest, jeśli wyślesz tę listę objetc za pomocą get, na przykład sprawdź, czy masz poprawne odniesienie
źródło
Zmagałem się z tym problemem przez wiele godzin. Użyłem fragmentu. Problem nie polegał na zwróceniu pliku
view
. Poniżej mój kod:źródło
Zobacz moją odpowiedź, jeśli korzystasz z biblioteki powiązań danych systemu Android - upewnij się, że ustawiasz układ dla widoku recyklingu, a liczba elementów musi być większa niż 0
Miłego kodowania :-)
źródło
W moim przypadku ustawiłem identyfikator mojego RecyclerView na „recyclinglerView”. Wygląda na to, że ten identyfikator był już gdzieś zdefiniowany, ponieważ kiedy zmieniłem go na inny identyfikator, metody z adaptera zostały wywołane poprawnie.
źródło
Jeśli używasz niestandardowego adaptera, nie zapomnij ustawić ItemCount na rozmiar swojej kolekcji.
źródło
W moim przypadku rozmiar mojej listy wynosił 0 i nie wywoływał metody onCreateViewHolder. Musiałem wyświetlić wiadomość w środku pustej listy jako element zastępczy, więc zrobiłem to w ten sposób i działało jak urok. Odpowiedź udzielona przez @Konstantin Burov pomogła.
źródło
Mój szyfrator był metodą onBindViewHolder (posiadacz, pozycja) nadpisanej metody RecyclerView.adaptor, która nie została wywołana. Wywołano metodę onCreateViewHolder, wywołano getItemCount. Jeśli przeczytasz specyfikacje adaptera Recyclerview, dowiesz się, że jeśli nadpisałeś onBindViewHolder (posiadacz, pozycja, ładunki listy), zostanie wywołany na korzyść. Więc proszę uważaj.
źródło
onBindViewHolder
?Jeśli umieścisz wrap_content jako wysokość swojej listy, a także wysokość listy pozycji, nic się nie pojawi i żadna z twoich funkcji recyclinglerView nie zostanie wywołana. Popraw wysokość elementu lub wpisz match_parent jako wysokość listy. To rozwiązało mój problem.
źródło
Moim błędem było zawyżenie niewłaściwego widoku w Fragment onCreateView.
źródło
przejdź do swojego xml. I zmień układ, aby zawijać zawartość. Jeden element ukrywa następny, więc metody nie działają!
źródło
Proszę wykonaj następujące czynności
źródło
W moim przypadku po zmianie Activity na używanie ViewModel i DataBinding, zapomniałem usunąć
setContentView
wywołanieonCreate
metody z metody. Usuwając go, mój problem został rozwiązany.źródło
U mnie było tak, ponieważ setHasStableIds (true); metoda została ustawiona. Usuń to i zadziała
źródło
recyklerView.setAdapter (adapter); wywołana Lista recyclinglerView jest wypełniana przez wywołanie metody.
źródło
Upewnij się, że Twój kod
XML
iKoltin/Java
kod są zgodne. W moim przypadku miałem problem zeViewHolder
skoro napisałem:Ale ponieważ mój kod XML to:
Musiałem zmienić tajny wiersz na:
Dodatkowo musiałem też usunąć:
Mam nadzieję, że to ci pomoże :)
źródło
W moim przypadku brakowało dzwonienia
notifyDataSetChanged()
po ustawieniach listy w adapterze.źródło
W moim przypadku brakuje mi ustawienia orientacji w moim LinearLayout.
Po dodaniu problemu z orientacją naprawiono.
źródło
Mój problem był
layout_height
ilayout_width
zestawu RecyclerView do0dp
.źródło