Android 5.0'da RecyclerView'ı kullanmaya çalışırken uygulama çöküyor


92

Yeni RecyclerView ile uğraşmaya çalışıyorum ve ne zaman çalıştırmaya çalışsam, uygulamam hemen çöküyor. Yöntemlere erişmeye çalıştığım için bana NullPointerException veriyor android.support.v7.widget.RecyclerView. Diğer gönderilere baktım ve çoğu insanın sahip olmadığını gördüm compile 'com.android.support:recyclerview-v7:+'ama bunu denedim ve hiç yardımcı olmadı. Bu noktada ne yapacağınızdan tam olarak emin değilseniz, herhangi bir yardım takdir edilecektir. İşte hata günlüğü: (Bir resim gönderirdim ama henüz 10 temsilcim yok)

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView$LayoutManager.onMeasure(android.support.v7.widget.RecyclerView$Recycler, android.support.v7.widget.RecyclerView$State, int, int)' on a null object reference
        at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:1764)
        at android.view.View.measure(View.java:17430)
        at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:727)
        at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:463)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
        at android.view.View.measure(View.java:17430)
        at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:851)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
        at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2560)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2001)
        at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1166)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1372)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1054)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5786)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
        at android.view.Choreographer.doCallbacks(Choreographer.java:580)
        at android.view.Choreographer.doFrame(Choreographer.java:550)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5221)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693)

Viewpager sekmelerinin neden olduğu bu hatayı yaşayan herkes için bu çözümü görün
Hassan Gilak

Bunu çözdün mü? Lütfen yardım et aynı sorunu yaşıyorum
Sagar

Çıkardığınız onCreateView/ imha ettiğiniz / kaydını onDestroyViewiptal ettiğiniz şeyi ayarlamayı / oluşturmayı / kaydetmeyi unutmayın ... Bu yaşam döngülerini takip etmelisiniz !
Sakiboy

Yanıtlar:


212

Hiçbir zaman bu sorun genellikle oluşur LayoutManageriçin sağlandı RecyclerView. Bunu şu şekilde yapabilirsiniz:

final LinearLayoutManager layoutManager = new LinearLayoutManager(context);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(layoutManager);

14
Son olması gerektiğini düşünmüyorum, bu yüzden sorunun bu olduğunu düşünmüyorum. Benim durumumda recyclerView ile bir parça uyguluyordum ve sadece onCreateView'dan bir referans tutmaya ve daha sonra veriler yüklendiğinde bir layoutManager ayarlamaya çalıştım. Bu sorunu yaşadım ve onCreateView yönteminde layoutManager'ı daha önce oyunda ayarladığımda ortadan kalktı.
Nemanja Kovacevic

3
@ NemanjaKovačević iyi, sanırım daha sonra değiştirilmesi gerekmeyen her değişkenin olarak bildirilmesi gerekiyor final, bu yüzden finalburada açıkladım .
aga

2
LinearLayoutManager varsayılan olarak dikey olduğundan, şunları kullanabilirsiniz: recyclerView.setLayoutManager (new LinearLayoutManager (context));
ll

1
Tanrı'ya şükür, Google tarafından yapılan hata mesajlarının aynısını Google'da anlamlı hale getirebiliriz.
jhegedus

1
@wesleyfranks, 1. RecyclerView'ı ayarlayan koda ve 2. çökmeden sonra elde ettiğiniz yığın izine bakmadan neden boş nesne başvurusu aldığınızı söylemek zor. :)
aga

26

Benim durumumda bu 'nihai' ile bağlantılı değil, @ NemanjaKovačević'in @aga cevabına yapılan yorumda belirtilen konu ile bağlantılıydı. Veri yüklemesine bir layoutManager ayarlıyordum ve aynı çökmenin nedeni buydu. LayoutManager kurulumunu parçamın onCreateView'e taşıdıktan sonra sorun düzeltildi.

Bunun gibi bir şey:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState)
{
...
mRecyclerView = (RecyclerView) rootView.findViewById(R.id.recycler);

mLayoutManager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
mRecyclerView.setLayoutManager(mLayoutManager);

1
Bir kez daha: Bu konunun bir şekilde değişkenin nihai olmamasıyla ilgili olduğunu söylemiyorum. Sorun şu ki LayoutManager , sağlanmadı , hepsi bu. Değişkeni LayoutManagerfinali işaret edebilir veya nihai olmayabilir - hiçbir şeyi değiştirmez.
aga

@Yurik Activity'de recyclerview kullanıyorum parça üzerinde değil. benim için durum ne?
Youri

@Youri, layoutManager kurulumunu etkinliğinizin onCreate bölümüne yerleştirmeniz gerektiğini düşünüyorum.
YuriK

10

Benim için aynı sorunu yaşıyordum, sorun, xml'de kullanılmayan bir RecyclerView olmasıydı, ancak bunu Activity'deki herhangi bir adaptöre bağlamıyorum, dolayısıyla sorun. Bu tür kullanılmayan geri dönüşümcü görünümlerini xml'de kaldırır kaldırmaz çözüldü

yani - kodla çağrılmadığı veya herhangi bir adaptör ayarlandığı için bu görünümü kaldırdım

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

Aynı burada her şey mükemmeldi, ama çalışmıyordu. Bu yüzden kullanılmayan geri dönüşümlü görünümleri kaldırdım ve herhangi bir sorun olmadan çalıştı. Teşekkür adam @Maurice ^^
Bhupinder

1
bir günü boşa harcadıktan sonra çözümünüzü denedim ve işe yaradı: D [:( zamanım boşa gitti]
mfaisalhyder

9

RecyclerView.LayoutManagerDüzgün ayarlanmış olmasına rağmen bu çökmeyi yaşadım . Bu sorunu gidermek için RecyclerView başlatma kodunu onViewCreated(...)geri aramaya taşımam gerekiyordu.

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_listing, container, false);
    rootView.setTag(TAG);
    return inflater.inflate(R.layout.fragment_listing, container, false);
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

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

    mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
    mRecyclerView.setItemAnimator(new DefaultItemAnimator());
    mRecyclerView.setLayoutManager(mLayoutManager);

    mAdapter = new ListingAdapter(mListing);
    mRecyclerView.setAdapter(mAdapter);
}

2
Yine de sorunum çözülmedi: / Hemen hemen her çözümü denedim ve PagerView'da gösterilecek bir parçanın içinde RecyclerView kullanırken hala aynı hatayı alıyorum :(
mfaisalhyder

Harika! RecyclerViewBaşlatma kodunu onViewCreated(...) çalışılan kod içine taşıma
Marcelo Gracietti

Bu çözümü yaptım ve hala benim için boştu. Yine de nerede olduğunu anlamaya çalışıyorum.
wesley franks

5

Sen kullanmak gerekir setLayoutManageriçinde RecyclerView#onCreate()yöntemle. recyclerViewBir görünüme eklemeden önce LayoutManagersete sahip olması gerekir .

 private RecyclerView menuAsList;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);

    menuAsList = (RecyclerView) findViewById(R.id.recyclerView_mainMenu);
    menuAsList.setLayoutManager(new LinearLayoutManager(Home.this));

}

3

Bu sorunu yanlış RecyclerViewkimlik referansı nedeniyle aldım .

recyclerView = (RecyclerView) findViewById(R.id.rv_followers_list);

-e

recyclerView = (RecyclerView) findViewById(R.id.rv_search_list);

2
recyclerView =
            (RecyclerView) findViewById(R.id.recycler_view2);

Geri dönüşümcü görünüm kimliğinizi kontrol edin, gerçek geri dönüşümcü görünümüne işaret ederek sorunumu çözdü


1

Benim sorunum XML lyout'umdaydı Bir android: animateLayoutChanges true olarak ayarlanmış ve Java kodunda RecyclerView adaptöründe notifyDataSetChanged () 'i çağırdım.

Bu yüzden, düzenimden android: animateLayoutChanges'ı kaldırdım ve bu sorunumu çözdü.


1

Butterknife kitaplığını kullanırken bu sorunu yaşadım. Sahiptim:

View rootView = inflater.inflate
                (R.layout.fragment_recipe_detail_view, container, false);
ButterKnife.bind(rootView);

Ancak doğru versiyon:

View rootView = inflater.inflate
                (R.layout.fragment_recipe_detail_view, container, false);
ButterKnife.bind(this, rootView);

1

In Gradle Bu kütüphaneyi uygulamak:

implementation 'com.android.support:appcompat-v7:SDK_VER'
implementation 'com.android.support:design:SDK_VER'
implementation 'com.android.support:support-v4:SDK_VER'
implementation 'com.android.support:support-v13:SDK_VER'
implementation 'com.android.support:recyclerview-v7:SDK_VER'

Gelen XML böyle söz:

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

In Parçası Kullandığımız recyclerViewböyle:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
       View rootView = inflater.inflate(R.layout.YOUR_LAYOUT_NAME, container, false);

       RecyclerView recyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerView);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false);
        recyclerView.setLayoutManager(layoutManager);
        APICallMethod();
        YOURADAPTER = new YOURADAPTER(getActivity(), YOUR_LIST); // you can use that adapter after for loop in response(APICALLMETHOD)
        recyclerView.setAdapter(YOURADAPTER);
        return rootView;
    }

Gelen Aktivite Kullandığımız RecyclerViewböyle:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.YOUR_LAYOUT_NAME);

        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false);
        recyclerView.setLayoutManager(layoutManager);
        APICallMethod();
        YOURADAPTER = new YOURADAPTER(ACTIVITY_NAME.this, YOUR_LIST); // you can use that adapter after for loop in response(APICALLMETHOD)
        recyclerView.setAdapter(YOURADAPTER);
   }

yatay olarak ihtiyacınız varsa şunu yapın RecyclerView:

RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false);
        recyclerView.setLayoutManager(layoutManager);
        APICallMethod();
        YOURADAPTER = new YOURADAPTER(ACTIVITY_NAME.this, YOUR_LIST); // you can use that adapter after for loop in response(APICALLMETHOD)
        recyclerView.setAdapter(YOURADAPTER);

Kullanmak istediğiniz takdirde GridLayoutManager kullanarak RecyclerViewböyle kullanımını:

        RecyclerView recyclerView = findViewById(R.id.rvNumbers);
        recyclerView.setLayoutManager(new GridLayoutManager(this, 3)); // 3 is number of columns.
        adapter = new MyRecyclerViewAdapter(this, data);
        recyclerView.setAdapter(adapter);

1

Ben kullanıyordum Bağımlılık Injection - BUTTERKNIFE ve ben görünümü binded değil çünkü bu sorun gündeme getirir.

Yani onCreate () 'in içine şu satırı ekledim:

ButterKnife.bind(this);

Dependency Injection ile RecyclerView bildirimim:

@BindView(R.id.recyclerview)
RecyclerView recyclerView;

1

Kullananlar için: uygulama 'androidx.recyclerview: recyclerview: 1.1.0-beta05'

bunu xml düzeninizde kullandığınızdan emin olun

Uygulamamı API 27'nin altında çalıştırırken de bir kilitlenme yaşadım . Mesajın bağlantısı burada.

Başlangıçta, geri dönüşüm görünümünde metin görünümümün yazı tipi boyutunu değiştirmek için bir stil oluşturdum, bu yüzden bu kodu aşağıda oluşturdum: (Yazı tipi boyutunu ekran boyutlarına göre değiştirirken sadece @dimen'i çağırabilirdim)

Style.xml içinde

ve bunu temama ekledi

temalar.xml

Araştırdıktan sonra, bunun bana bir hataya neden olduğunu öğrendim ve stili kaldırdıktan sonra artık bir çökme yaşamıyorum.

Burada bulduğum tüm olası çözümleri yığın taşmasında denedim ve neredeyse bundan vazgeçtim, şükürler olsun ki neden stili kaldırmayacağımı düşündüm belki de bu çökmeye neden olur ve sonra patlama sona erer.


1
Lütfen resimlere bağlantı vermek yerine doğrudan kod örnekleri ekleyin. "Başkalarının sorunu yeniden oluşturmasına yardımcı olun" bölümüne bir göz atın: stackoverflow.com/help/how-to-ask
Chris B

1
Ben gerçekten bunun için @ChrisB. Gördüğünüz gibi itibarım çok düşük olduğu için buraya ilk kez yorum yapıyorum. Bugün çökmeyle karşılaştım ve buraya yazmayı düşünüyordum çünkü belki de bununla karşı karşıya olan insanlar var, özellikle 'androidx.recyclerview: recyclerview: 1.1.0-beta05' kullanıyorlar.
Jeanne,

0

LinearLayoutManager varsayılan olarak dikey olduğundan, bunu yapmanın daha kolay bir yolu şudur:

recyclerView.setLayoutManager(new LinearLayoutManager(context));

Yönlendirmeyi değiştirmek isterseniz bu kurucuyu kullanabilirsiniz:

public LinearLayoutManager(Context context, int orientation, boolean reverseLayout);

Şu anda tuhaf bir doğrusal düzen yöneticisine sahip olmak. Onu örneklendiriyorum ama hala bu hatayı yaşıyorum. kutsal inek.
filthy_wizard

0

Sanırım senin içindeki problem Adapter. Emin döndü olun ViewHolderiçinde onCreateViewHolder(). Aşağıdaki gibi:

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v;
    v = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_leaderboard, parent, false);
    ViewHolder view_holder = new ViewHolder(v);
    return view_holder;
}

0

Benim için sorun, recycleView'ın bir kimliği olmadığı Activity_main.xml (21) ile ilgiliydi.

activity_main.xml (21)

 <android.support.v7.widget.RecyclerView
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="8dp"
    android:layout_marginLeft="8dp"
    android:layout_marginTop="8dp"
    android:layout_marginEnd="8dp"
    android:layout_marginRight="8dp"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.0"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/button3"
    tools:listitem="@layout/transaction_list_row" />

activity_main.xml

<android.support.v7.widget.RecyclerView

    android:id="@+id/transac_recycler_view"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="8dp"
    android:layout_marginLeft="8dp"
    android:layout_marginTop="8dp"
    android:layout_marginEnd="8dp"
    android:layout_marginRight="8dp"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.0"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/button3"
    />

Activity_main.xml (21) recycleView'a bir android: id = "@ + id / transac_recycler_view" eklediğimde çalıştı


0

Benim durumumda, sadece butterknife kitaplığı ekledim ve annotationProcessor eklemeyi unuttum. Build.gradle'a (Uygulama modülü) aşağıdaki satırı ekleyerek sorunumu çözdüm.

    annotationProcessor 'com.jakewharton:butterknife-compiler:10.1.0'

0

Recyclerview recylerview = findbyid (R.id.recyclerview) Kaçırmış olabilirsiniz


Merhaba, SO'ya hoş geldiniz! Lütfen bunun neden bu soruyla alakalı olduğunu biraz daha açıklayın. Şu anda yazıldığı için neye atıfta bulunduğunuzu söylemek zor.
Piotr Kamoda

0

Başvurumu GenyMotion üzerinde test ettiğimde de benzer bir sorun yaşadım. Cihazı GenyMotion'da yeniden başlattıktan sonra sorun çözüldü


0

RecyclerView'ı activity_main.xml'de değil, başka bir düzende kullandığım için aynı sorunla karşılaştım.

Bazı sitelerde arama yaparak bir şey elde ettim ve burada paylaşmak istediğimi hissettim

  1. Activity_main.xml'e etiketi Dahil Etmek için Kimlik Ekle

    <include id="includedRecyclerLayout" .... </include>

  2. MainActivity.java'da Kimliğe göre görünümü Aramadan önce bu düzeni çağırın

    `ConstraintLayout includedLayout = findViewById (R.id.inckudedRecyclerLayout);

    RecyclerViewrecyclerview = includeLayout.findViewById (R.id.RECYCLER_VIEW_ID) `;


0

Butterknife kullanırken bu problemi yaşadım, fragment kullanıyordum

Fragment için olmalıdır ButterKnife.bind(this,view);

Aktivite için ButterKnife.bind(this);


-1

Eğer sen nerede olursam bunu yapacağım. onView (withId (android.R.id.list)). perform (RecyclerViewActions.scrollToPosition (3)); android.R.id.list bunu liste kimliğinize değiştirin ve konum diziniz içindeki konumunuz olacaktır.


-1

parça kullanarak

onCreateView () 'da kod yazma

RecyclerView recyVideo = view.findViewById (R.id.recyVideoFag);

aktivite kullanma

onCreate () RecyclerView recyVideo = findViewById (R.id.recyVideoFag) kod yazma;

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.