Recyclerview onCreateViewHolder'ı çağırmıyor


150

Benim RecyclerViewçağırmaz onCreateViewHolder, onBindViewHolderhatta MenuViewHolderbu nedenle hiçbir şey göründüğü, yapıcı RecyclerView. Hata ayıklama için günlükler koydum ve hiçbir günlük gösterilmiyor. Sorun ne olabilir?

Adaptörüm:

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

Özel satır XML'im:

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

ve Parçam:

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

neden u ayarlamak recyclerView.setAdapter (adaptör); 2 kez?
Panayiotis Irakleous

Bu sorunun bir başka nedeni yanlışlıkla öğe düzenini üst öğenin yüksekliğiyle eşleştirmektir, bu nedenle bir seferde yalnızca bir öğe gösterilir.
Joe Lapp

Benim durumumda bu yardım: invoicesRecyclerView.setHasFixedSize (true) invoicesRecyclerView.setLayoutManager (GridLayoutManager (this, 1))
a_subscriber 19:19

Yanıtlar:


239

Sizin getItemCountyönteminiz returns 0. Bu yüzden RecyclerViewasla bir görüş başlatmaya çalışmaz. Bir şey döndürmesini sağlayın greater than 0.

Örneğin

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

25
Aman tanrım, şu anda kendimi çok aptal hissediyorum! : facepalm: Bunun için teşekkürler!
Shinta S

3
Ben getItemCount diğer tüm kodun altında yol aşağı ve ben görmedim çünkü bu sadece bir saat kaybetti. : |
Joel

Özel bir bağdaştırıcım vardı ve itemcount'umu koleksiyonumun boyutuna ayarlamayı unutmuştum
Dooie

3
öğe sayım 3 hala görünmüyor, onBind veya onCreateHolder'da hata ayıklama noktası yok ... ancak getItemCount
Dr. aNdRO'da

Ah adamım! Ben de bununla neden kırılma noktamın neden vurmadığını anlamak için mücadele ediyordum ve şimdi biliyorum ... LOL! LANET OLSUN!!! TEŞEKKÜR EDERİM!
Vincy

409

Bir diğeri, düzen yöneticisini RecyclerView olarak ayarladığınızdan emin olun:

recycler.setLayoutManager(new LinearLayoutManager(this));

2
Bu cevaba tekrar geldim waaay çok sık…
finki


15

Bu sizin durumunuz için geçerli değildir. Ama bu başka birine yardımcı olabilir.

Bu sebep aşağıdaki yöntemin dikkatsiz kullanılması olabilir

recyclerView.setHasFixedSize(true);

Dikkatli kullanılmalıdır değil, bu neden olabilir onBindViewve onCreateViewHolderhiç günlüklerinde hiçbir hata ile, hiç çağrılamaz.


12

Lütfen düzen yöneticisini RecyclerViewaşağıdaki kodu beğenecek şekilde ayarlayın :

RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view_right);
//set your recycler view adapter here
NavigationAdapter adapter = new NavigationAdapter(this, FragmentDrawer.getData());
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));

9

Değer için, adaptör başlatılmadan önce geri dönüşüm görüntüleme adaptörünü ayarladığımda bunu gözlemledim . Çözüm, recyclerView.setAdapter(adapter)boş olmayan bir adaptörle çağrıldığından emin olmaktı


9

Gerçekten gerçekten bu birisi birgün size yardımcı olmuştur. Sadece bir saatten fazla bu çırpıda çıldırıyorum!

Bu vardı:

projects_recycler_view.apply {
            this.layoutManager = linearLayoutManager
            this.adapter = adapter
        }

Ne zaman bu olmalıydı:

projects_recycler_view.apply {
            this.layoutManager = linearLayoutManager
            this.adapter = projectAdapter
        }

Aptalca adaptörümü aradığım adapteriçin, uygulama bloğundaki geri dönüşüm görünümünün adaptörü tarafından gölgeleniyordu! Adaptörü ayırt etmek için projectAdapter olarak yeniden adlandırdım ve sorun çözüldü!


6

Yüksekliğini ayarlama TextViewbölgesi custom.xmlveya RecyclerView. Yükseklik ise wrap-content, RecyclerViewgörünmez.


Bu konuda çok zaman geçirdim .. geri dönüşümcü görünümünün yüksekliği sıfırdı. Bir aktivitede kullanıldığında, bir şekilde kendini genişletti. Diğer mizanpajların içindeki bir fragmanda .. olmadı
Asif Shiraz

4

Bu durum a'nın RecyclerViewiçindeyken ScrollViewve Android Destek Kütüphanesi 23.0'ı kullanırken oldu. Düzeltmek için Android Destek Kitaplığı 23.2'ye güncelledim:

Build.gradle içinde:

dependencies {
    ...
    compile 'com.android.support:appcompat-v7:23.2.+'
    compile 'com.android.support:cardview-v7:23.2.+'
}

4

Bunu Adaptör Sınıfınıza ekleyin

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

Ayrıca, bu bir yinelenen
Ricardo A.

4

Belki birisine yardımcı olur, ancak RecycleView'inizin görünürlüğünü GONE olarak ayarlarsanız, adaptör yöntemleri hiç çağrılmaz ... Bunu çözmem için biraz zaman aldı.


inanılmaz !!!!! ... tanklar çok ,,,
X-Black ...

3

Aynı sorunu yaşadım, çünkü android.support.constraint.ConstraintLayoutmizanpaj kaynağında kullanıyordum . Yardımcı olarak değiştirildi FrameLayout.


Çözümünüz için teşekkür ederim. View ebeveyni neden böyle davranıyor android.support.constraint.ConstraintLayout?
Adrian Buciuman

2

Diğer seçenek, bu listeyi objetc'i get kullanarak gönderirseniz, doğru referansınız olup olmadığını doğrulayın, örneğin

private list<objetc> listObjetc;
//Incorrect
public void setListObjetcs(list<objetc> listObjetc){
  listObjetc = listObjetc;
}

//Correct
public void setListObjetcs(list<objetc> listObjetc){
  this.listObjetc = listObjetc;
}

2

Saatlerce bu sorunla mücadele ettim. Bir parça kullanıyordum. Ve sorun geri dönmüyordu view. Kodum aşağıdadır:

ProductGridBinding binding = DataBindingUtil.inflate( inflater, R.layout.product_grid, container, false);



    mLinearLayoutManager = new LinearLayoutManager(getActivity());
    mLinearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);

    binding.rvNumbers.setHasFixedSize(true);
    binding.rvNumbers.setLayoutManager(mLinearLayoutManager);
    binding.rvNumbers.setAdapter(adapter);


    View view = binding.getRoot();


    return view;

2
Garip kod. Bu değişkenleri ve sınıfları anlamak zordur.
CoolMind

2

Android veri bağlama kitaplığı kullanıyorsanız cevabımı görün - Geri dönüşüm görünümü için düzen ayarladığınızdan emin olun ve öğe sayısı 0'dan büyük olmalıdır

 @BindingAdapter({"entries", "layout"})
    public static void setEntries(RecyclerView view, ArrayList<LoginResponse.User> listOfUsers, int layoutId) {
        if (view.getAdapter() == null) {
            view.setLayoutManager(new LinearLayoutManager(view.getContext()));
            SingleLayoutAdapter adapter = new SingleLayoutAdapter(layoutId) {
                @Override
                protected Object getObjForPosition(int position) {

                    return listOfUsers.get(position);
                }

                @Override
                public int getItemCount() {
                    return listOfUsers.size();
                }
            };
            view.setAdapter(adapter);
        }
    }

Mutlu kodlama :-)


1

Benim durumumda RecyclerView kimliğimi "recyclerView" olarak ayarladım. Görünüşe göre bu kimlik zaten bir yerde tanımlanmıştı, çünkü bunu farklı bir kimlikle değiştirdiğimde, adaptördeki yöntemler düzgün çağrıldı.


1

Özel bir adaptör kullanıyorsanız, ItemCount'u koleksiyonunuzun boyutuna ayarlamayı unutmayın.


1

Benim durumumda, liste boyutum 0 idi ve onCreateViewHolder yöntemini çağırmıyordu. Boş liste için bir yer tutucu olarak merkezinde bir mesaj görüntülemek gerekiyordu, bu yüzden böyle yaptım ve çekicilik gibi çalıştı. Tarafından cevap @Konstantin Burov helped.

  @Override
public int getItemCount() {
    if (contactList.size() == 0) {
        return 1;
    } else {
        return contactList.size();
    }
}

Bu gerçekten iyi bir fikir değil. Bağdaştırıcıya veri koyarken boş iletinin görünürlüğünü ayarlamak daha iyidir.
İnanılmaz Ocak

1

Bilgisayarım RecyclerView.adaptor çağrılmayan onBindViewHolder (tutucu, konum) geçersiz kılınmış yöntemdi. OnCreateViewHolder yöntemi çağrıldı, getItemCount çağrıldı. Recyclerview Bağdaştırıcısının özelliklerini okursanız, onBindViewHolder (geçersiz kılma, konum, Liste yükleri) üzerine yazdıysanız lehinize çağrılacağını öğreneceksiniz. Lütfen dikkatli olun.


Aramama problemini nasıl çözdünüz onBindViewHolder?
CoolMind

1

Wrap_content öğesini hem listenizin yüksekliği hem de öğe listenizin yüksekliği olarak koyarsanız hiçbir şey görünmez ve recyclerView işlevlerinizden hiçbiri çağrılmaz. Öğenin yüksekliğini sabitleyin veya liste yüksekliği için match_parent koyun. Bu benim sorunumu çözdü.


1

Benim hatam Fragment onCreateView yanlış görünümü şişirme oldu.



0

Lütfen aşağıdakileri yapın

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

0

Benim durumumda ViewModel ve DataBinding kullanmak için Etkinlik değiştirdikten sonra, setContentViewyöntem çağırma onCreateyöntemini kaldırmayı unutmuştu . Bunu kaldırarak sorunum çözüldü.


0

Benim için bunun nedeni setHasStableIds (true); yöntemi ayarlandı. Bunu kaldırın ve işe yarayacak


Ancak bu yöntem , sorudaki minimal tekrarlanabilir örnekte görünmemektedir . Bu ipucunu kaldırmak bir şeyi düzeltirse, muhtemelen görünüm sahibinin veya belki de bildiricinin uygulanmasındaki bir hatanın bir göstergesidir.

0

recyclerView.setAdapter (adaptör); denilen recyclerView listesi, yöntem çağrılarak doldurulur.


0

XMLVe Koltin/Javakodunuzun eşleştiğinden emin olun . Benim durumumda, yazdığımdan beri bir sorunum ViewHoldervardı:

var txt: AppCompatTextView = itemView.findViewById(R.id.txt)

Ancak XML kodum olduğu için:

<TextView
        android:id="@+id/txt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        .../>

Gizemli satırı şu şekilde değiştirmek zorunda kaldım:

var txt: TextView = itemView.findViewById(R.id.txt)

Ayrıca, kaldırmak zorunda kaldım:

recyclerView.setHasFixedSize(true);

Umuyorum ki bu sana yardım edebilir :)


0

Benim durumumda, notifyDataSetChanged()bağdaştırıcıda liste ayarladıktan sonra arama eksikti .

public void setUserList(List<UserList> userList) {
      this.userList = userList;
        notifyDataSetChanged();
}

0

Benim durumumda, LinearLayout'umda yönlendirmeyi ayarlamayı özledim.

Oryantasyon ekledikten sonra sorun düzeltildi.

 android:orientation="vertical"

0

Benim sorunum oldu layout_heightve layout_widthRecyclerView olarak ayarlanmış 0dp.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.