Soru RecyclerView onCreateViewHolder veya onBindView çağırmıyor


Herhangi bir hata almamak ve tüm veriler geçerli gibi görünüyor. Bazı nedenlerden dolayı, görüşle ilgili yöntemler deneniyor. Aşağıdakilerden emin oldum:

  • getItemCount () çağrılan tek bağdaştırıcı yöntemidir ve pozitif bir tamsayı değeri döndürüyor, (Bunun bakacağınız alanın olacağını biliyorum)

    • Yapıcı çağrılıyor, üye değişkenleri geçerli.

    • Ana Görünüm dikey LinearLayout; görünümde kaydırma özellikleri veya kendi kaydırma özelliklerine sahip başka bir görünüm yok.

    • parça görünümü içeren ekran oluşturulur ve gösterilir.

İşte parçanın bildirimi ve ardından adaptör geliyor. Tamamen şaşkın olduğu için herhangi bir yardım mutluluk duyacaktır.

SubMenuAdapter adapter = new SubMenuAdapter(getActivity(), mContentItems);
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.setAdapter(adapter);
public class SubMenuAdapter extends RecyclerView.Adapter<SubMenuAdapter.ViewHolder> {
private static final String TAG = String.format("==> %S", SubMenuAdapter.class.getSimpleName());

private final List<ContentItem> mContentItems;
private Context mContext;

public SubMenuAdapter(Context context, List<ContentItem> contenItems) {
    Log.d(TAG, "Constructor called");
    mContentItems = contenItems;
    mContext = context;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    Log.d(TAG, "onCreateViewHolder called");
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_resource_efficiency, parent, false);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    Log.d(TAG, "onBindViewHolder called");

    ContentItem item = mContentItems.get(position);
    holder.textName.setText(item.getName());
    FontSetter.setMyriadProRegular(mContext, holder.textName);
    Picasso.with(mContext).load("file://" + item.getPreviewImageDefault()).into(holder.imageIcon);
}

@Override
public int getItemCount() {
    Log.d(mContext, String.format("getItemCount: %d", mContentItems.size()));
    return mContentItems.size();
}

// ViewHolder
public static class ViewHolder extends RecyclerView.ViewHolder {

    TextView textName;
    ImageView imageIcon;

    public ViewHolder(View view) {
        super(view);
        textName = (TextView) view.findViewById(R.id.tv_resource_efficiency_option);
        imageIcon = (ImageView) view.findViewById(R.id.iv_resource_efficiency_icon);
    }
}

44
2018-03-11 17:06


Menşei


'Match_parent', 'wrap_content' ve 400dp boyutlarını denedim, hepsinde mavi arka plan değeri ve hala hiçbir şey yok. Ayrıca görünürlüğü açıkça görünür olarak ayarladım - hala hiçbir şey. Her ne kadar metotlar, görünümleri oluşturmak ve bağlamak için çağrılmadıkça, görünmesini beklemiyordum. - Conti
Ben aynı sorun var, adaptör değişti veri, notifyDataSetChanged çağrıldı, setAdapter yürütüldü, canlı ve parçalanmış fragman, ancak onCreateViewHolder veya onBindView çağırmadı. Tüm veiws görünür. - Raskilas
Aynı sorun benim Adaptör yöntem getItemCount () 0 daha büyük dönüyor ve hala olumlu sonuç yok. SrollView ve RecycleView çalışma toghether ile ilgili bir sorun olduğunu düşünüyorum. - Sniper
Bu da bana oluyor. Tuhaf olan şey, mükemmel bir şekilde çalışan aynı projede başka bir RecyclerView'ım var. - Martin Epsz
@IgorGanapolsky BitBucket'imde arama yapmalı ve onu bulmalıyım, 7 ay önce bu soruyu sundum ve saatlerce harcadıktan sonra pes ettim. Ama 3. mermi noktasını kontrol et, "Ebeveyn Görünümü, dikey LinearLayout; kaydırma görünümü yok veya görünürde kendi kaydırma özelliklerine sahip başka bir görünümdür." Hiyerarşide hiç kaydırma yok. - Conti


Cevaplar:


Bu da birine yardımcı olabilir

İlk kullanım

recyclerView.setAdapter(adapter);

Ve sonra:

recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

Yani şöyle görünecek:

recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

Sipariş tersine döndü


64
2018-03-04 17:59



işe yarayan tek şey - styler1972
Bunun neden böyle olması gerektiğine dair bir açıklamanız var mı? - igoris
Merhaba @igoris ne yazık ki, ben sadece bu çözüm deneme yanılma ile aldım. - Aerim
onun çalışma teşekkürler @Aerim - Anand Phadke


Görünümün geri dönüşümünün nestedscrollview'den çocuk olmadığından emin olun.

örneğin, bu kod çalışmayacak.

<android.support.v4.widget.NestedScrollView
    android:id="@+id/responder_scroll"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/darkGray"
    android:clipToPadding="false"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.v7.widget.CardView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="24dp"
            app:cardElevation="@dimen/spacing_medium"
            app:cardUseCompatPadding="true">

            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

                <TextView
                    android:id="@+id/responder_testimonial"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentTop="true"
                    android:text="Testimonial"
                    android:textSize="@dimen/general_font_size" />

                <TextView
                    android:id="@+id/responder_counter_testimonial"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_toRightOf="@+id/responder_testimonial"
                    android:text="170"
                    android:textSize="@dimen/general_font_size_small" />

                <Button
                    android:id="@+id/responder_btn_testimonial"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentRight="true"
                    android:layout_alignParentTop="true"
                    android:text="Go" />

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

    </FrameLayout>
</android.support.v4.widget.NestedScrollView>

sonra kullanırım

<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">

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


18
2017-10-12 09:49



Gerçekten de bu sorun, bir ScrollView'da RecyclerView'ımı yerleştirerek bana neden oldu. Bunu çözmek için RecyclerView'ımda özel bir LayoutManager ayarlıyorum. - Igor Ganapolsky
Merhaba, evet, ben de özel LayoutManager kullanıyorum - raditya gumay
Bunun için sonsuza kadar harcadım. Geri dönüştürücü bakışımın doğrudan bir alt görünüm veya iç içe geçmiş kaydırma görünümü olmamasına rağmen bu soruna rastladım. Bu bilinen bir hata mı, yoksa sadece tasarım mı? - startoftext
tam olarak bilmiyorum. ama nestedscrollview kullanmak istiyorsanız, bunun içinde bir görünüm kullanmalısınız. - raditya gumay
Tersine, ScrollView, NestedScrollView ile değiştirilir ve kod çalışmaya başlar (ScrollView> LinearLayout> RecyclerView). Her neyse, yardımınla - Vassiliy Vorobyov


Bir saatten fazla bir süredir cevap bekliyorum.

Bağdaştırıcınızı ayarlamadan önce bu tek astarı aramayı unutmayın.

recyclerView.setLayoutManager(new LinearLayoutManager(this));

Geri dönüştürücü görünümünde, yerleşik olarak varsayılan düzen yöneticisi seçeneği bulunmadığı için, programlı olarak eklememiz gerekiyor.

Yardımcı bulduysanız şerefe.


14
2017-12-26 02:36



ohh! Onu unuttum. Teşekkürler! +1 - avisper
@avisper sonunda çalıştığına sevindim. - ralphgabb
Burada aynı. Teşekkürler! - Utsav Gupta
evet bunu unuttum ve bütün gün denedim, nihayet cevaplar çapraz kontrol etmeme yardımcı oldu. - krishna murthy
Bu hissi biliyorum ve sadece bir satır kod içinde çözdüm. Sevindim yardımcı olur. - ralphgabb


Bunun kimseye yararlı olup olmayacağını bilmiyorum ama neredeyse aynı problemi yaşadım. Sorunum, parça / sınıf veya geri dönüştürücü adaptörde değildi. Sorun, actionbar'ın götürdüğü üst XML düzenindeydi. match_parent nerede FrameLayout - parçanın değiştirildiği yer - gösterilecek herhangi bir yer almadı. Bu yüzden yöntemler çağrılmadı.

Aynı problemle karşı karşıya olanlar için benzer senaryolar olabilir. Sorun, bağdaştırıcıda hiç olmadığı için, her XML dosyasındaki her genişlik ve yüksekliğin aynı ağaçta olabileceğini kontrol edin.


11
2018-02-17 11:49



Beni kurtardın!! tam olarak aynı şeyi yapıyordu - nikhil
Cevabım yardım etti - Abdul-Rahman Ahmad
Bana yardım et Abdul-Rahman! - Jon Zangitu


Benim iki kuruşum burada. Sadece üç saatten fazla hata ayıklama harcadım.

Aşağıdaki satırı dikkatsizce kullanmadığınızdan emin olun.

recyclerView.setHasFixedSize(true);

Sabit boyutu yalnızca, görünümün sabit bir boyuta sahip olduğundan eminseniz ayarlayın. Değilse, onCreateViewHolder ve onBindView yöntemleri hiç çağrılmayabilir.


5
2018-02-05 16:16



Çok teşekkürler. Bu benim için çalıştı. Ayrıca, aynı cevaptan bahsetti İşte - venky
Yardım ettiğim için çok mutluyum :) - Venkatesh Shukla
Her yerde aradım. Ve sorun tam olarak böyle! - Gabriel


Aynı sorunla da karşı karşıya kaldım onCreateViewHolder veya onBindView yöntem sadece almadı, sadece getItemCount çağırıldı. Yani temelde boy ve ağırlığı ile sorunu vardı RecyclerView ayarlanmıştı wrap_content veya 0dp. Bir değere değiştirdikten sonra problemi çözdünüz.


4
2018-06-12 09:08





Bu konunun eski olduğunu biliyorum, ama aynı öğrenci hatalarını yaptıysanız, bunu yaptığınızda yardımcı olabilirsiniz.

Bazı web sitelerinde RecyclerView ve bazı kodları kopyalayıp içeriğime uyarlarken, aynı şeyi yapmak için farklı değişkenler (örneğin, kullanıcılar ve veriler) oluşturdum. Bazı yöntemler veri çağırıyor ve bazıları kullanıcı arıyordu. . Bu diğer kod ve java işlevselliğini anlamaya çalışırken yapmak için kolay bir hatadır (bu bana her zaman olur).

Konsolunuzda java kodunuzda herhangi bir yere yazdırabileceğinizi bilmek çok güzel, böylelikle bu kadar kolay bir şekilde hata ayıklayabilirsiniz.

İyi şanslar!


1
2017-07-16 00:20





Benim durumumda setHasStableIds (true) kullanıyordu; Bazı liste öğeleri getItemID () 'de -1 döndürürken bağdaştırıcıda, bu yüzden RecyclerView'ın eşit olduklarını düşündüğünü varsayalım.


1
2018-02-02 13:57



Teşekkürler! Üzerinde çok zaman harcadım. onBindViewHolder bazen aramamıştı. Benim durumumda yanlışlıkla setHasStableIds (true) ekledim; adaptörün yapıcısında. - CoolMind


Bu gerçekten çok eski, ama benim durumumda, bir ConstraintLayout ve yükseklik yanlıştı, bu yüzden görüşüm olurdu 0dp ve daha sonra adaptör 0dp olduğu için işini yapmak için tasarruf ediyor olacaktı.

Yüksekliğin ve genişliğin iyi olduğundan emin olun. RecyclerView pozitif bir boyuta sahiptir.


1
2018-02-15 16:29