Android 5.0でRecyclerViewを使用しようとするとアプリがクラッシュする


91

新しいRecyclerViewをいじろうとしています。実行しようとすると、アプリがすぐにクラッシュします。からメソッドにアクセスしようとするとNullPointerExceptionが発生しますandroid.support.v7.widget.RecyclerView。私は他の投稿を見て、ほとんどの人が持っていなかったことcompile 'com.android.support:recyclerview-v7:+'がわかりましたが、私はそれを試しました、そしてそれはまったく助けにはなりませんでした。この時点で何をすべきか本当にわからない、どんな助けもいただければ幸いです。ここでエラーログ:(私は写真を投稿しますが、まだ10人の担当者がいません)

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タブが原因でこのエラーが発生した場合は、このソリューションを
Hassan Gilak

これを解決しましたか?同じ問題が発生しているのを助けてください
Sagar

onCreateView削除/破棄/登録抹消で設定/作成/登録することを忘れないでくださいonDestroyView...これらのライフサイクルに従う必要があります!
Sakiboy 2017

回答:


211

この問題は通常、に何LayoutManagerも提供されていない場合に発生しRecyclerViewます。あなたはそうすることができます:

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

14
私はそれが最終的なものである必要はないと思うので、それが問題だったとは思いません。私の場合、recyclerViewを使用してフラグメントを実装しており、onCreateViewからの参照を保持し、後でデータが読み込まれるときにlayoutManagerを設定しようとしました。私はこの問題を抱えていましたが、gameinのonCreateViewメソッドの前半でlayoutManagerを設定したときに問題は解決しました。
Nemanja Kovacevic 14

3
@NemanjaKovačevićよく、後で変更する必要がないすべての変数をとして宣言する必要があると思うのでfinalfinalここで宣言しました。
2015年

2
LinearLayoutManagerはデフォルトで垂直なので、次のように使用できます:recyclerView.setLayoutManager(new LinearLayoutManager(context));
ll

1
Googleがそれらを理解するためにGoogleが作成したものと同じエラーメッセージをGoogleに送信できることを神に感謝します。
jhegedus

1
@wesleyfranks 1. RecyclerViewを設定するコードと2.クラッシュ後に取得するスタックトレースを確認せずに、nullオブジェクト参照を取得する理由を理解するのは困難です。:)
aga

26

私の場合、それは「最終」ではなく、@ agaの回答に対する@NemanjaKovačevićのコメントで言及されている問題に関連していました。データの読み込み時にlayoutManagerを設定していたため、同じクラッシュが発生しました。layoutManagerセットアップをフラグメントのonCreateViewに移動した後、問題は修正されました。

このようなもの:

@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
もう一度:この問題が変数が最終的でないことに何らかの関係があるとは言えません。問題は、LayoutManager 提供されなかったことです。それだけです。変数はLayoutManagerfinalを指すようにすることも、finalを指すようにすることもできます。何も変更しません。
2015年

@Yurik私はフラグメントではなくアクティビティでrecyclerviewを使用しています。私の場合はどうですか?
Youri

@Youriは、layoutManagerセットアップをアクティビティのonCreateに配置するだけでよいと思います。
YuriK

10

私にとって同じ問題が発生していました。問題は、ビューのなくなったxmlに未使用のRecyclerViewがあったことですが、アクティビティのどのアダプターにもバインドしていないため、問題が発生しました。このような未使用のリサイクラービューをxmlから削除するとすぐに解決されました

つまり、コードで呼び出されなかったか、アダプタが設定されているため、このビューを削除しました

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

同じことがすべて完璧でしたが、うまくいきませんでした。そこで、未使用のrecyclerviewsを削除しましたが、問題なく動作しました。ありがとう、@モーリス^^
Bhupinder

1
1日を無駄にした後、私はあなたの解決策を試してみましたが、それは
うまくいき

8

RecyclerView.LayoutManager適切に設定していても、このクラッシュが発生しました。この問題を修正するRecyclerView には、初期化コードをonViewCreated(...)コールバックに移動する必要がありました。

@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
それでも、私の問題は解決されていません:/ PagerView :(
mfaisalhyder

驚くばかり!移動RecyclerViewに初期化コードをonViewCreated(...) 働いた
マルセロGracietti

私はこの解決策を実行しましたが、それでも私にとっては無効でした。まだどこにいるのか理解しようとしています。
ウェズリーフランク

5

あなたは使用する必要がありますsetLayoutManagerRecyclerView#onCreate()する方法。recyclerViewビューに追加する前に、LayoutManagerセットが必要です。

 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

RecyclerViewIDの誤った参照が原因でこの問題が発生しました。

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

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

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

リサイクラービューIDを確認し、実際のリサイクラービューをポイントして私の問題を解決しました


1

私の問題は、私のXMLレイアウトにありました。android:animateLayoutChangesがあります。をtrueに設定していて、JavaコードのRecyclerViewのアダプターでnotifyDataSetChanged()を呼び出しました。

だから、私はちょうど私のレイアウトからandroid:animateLayoutChangesを削除しました、そしてそれは私の問題を再愛しました。


1

バターナイフライブラリを使用しているときにこの問題が発生しました。私が持っていた:

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

しかし、正しいバージョンは次のとおりです。

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

1

Gradleのこのライブラリを実装します。

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'

ではXMLのように言及します:

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

フラグメント我々は、使用しrecyclerView、このように:

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

活動我々は使用しRecyclerView、このように:

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

水平 が必要な場合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);

次のように使用してGridLayoutManagerRecyclerView使用したい場合:

        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

私が使っていた依存性の注入を - ButterKnifeを、この問題は、ビューをしていなかったために発生しました。

そのため、onCreate()の中に次の行を挿入しました。

ButterKnife.bind(this);

Dependency Injectionを使用したRecyclerView宣言:

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

1

使用している人のために:実装 'androidx.recyclerview:recyclerview:1.1.0-beta05'

これをXMLレイアウトで使用していることを確認してください

API 27の下でアプリを実行するとクラッシュも発生しました。メッセージへのリンクは次のとおりです

もともとは、recyclerview内のテキストビューのフォントサイズを変更するスタイルを作成したので、以下のコードを作成しました(画面サイズに基づいてフォントサイズを変更するときに、@ dimenを呼び出すだけで済みます)。

style.xmlの内部

これを私のテーマに追加しました

themes.xml

調査したところ、これがエラーの原因であることがわかり、スタイルを削除した後、クラッシュは発生しなくなりました。

私はここで見つけたスタックオーバーフローで考えられるすべての解決策を試してみましたが、これをほとんどあきらめました。ありがたいことに、好奇心からスタイルを削除しないとクラッシュが発生する可能性があり、ブームが発生しなくなりました。


1
画像にリンクするのではなく、コード例を直接含めてください。「他の人が問題を再現できるようにする」セクションをご覧ください
Chris B

1
私は本当にこの@ChrisBに賛成です。評判が低すぎるので、ここにコメントを書き込むのは初めてです。今日クラッシュに遭遇し、おそらくこれに直面している人々もいるので、ここに投稿するつもりでした。特に「androidx.recyclerview:recyclerview:1.1.0-beta05」を使用しています。
Jeanne vie

0

LinearLayoutManagerはデフォルトで垂直であるため、これを行う簡単な方法は次のとおりです。

recyclerView.setLayoutManager(new LinearLayoutManager(context));

向きを変更したい場合は、次のコンストラクタを使用できます。

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

奇妙なissulinearlayoutマネージャーがいます。それをインスタンス化していますが、まだこのエラーが発生しています。聖なる牛。
filthy_wizard

0

あなたの問題だと思いますAdapter。に戻っViewHolderたことを確認してくださいonCreateViewHolder()。以下のように:

@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

私にとっての問題は、recycleViewにIDがなかったactivity_main.xml(21)にありました。

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

android:id = "@ + id / transac_recycler_view"をactivity_main.xml(21)recycleViewに追加したときに機能しました


0

私の場合、バターナイフライブラリのみを追加し、annotationProcessorを追加するのを忘れました。build.gradle(アプリモジュール)に以下の行を追加することで、私の問題を解決しました。

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

0

Recyclerview recylerview = findbyid(R.id.recyclerview)見逃したかもしれません


こんにちは、SOへようこそ!これがこの質問に関連する理由をもう少し説明してください。それは現在書かれているので、あなたが何を参照しているかを言うのは難しいです。
Piotr鴨田


0

RecyclerViewがactivity_main.xmlではなく別のレイアウトにあるため、同じ問題に直面しました。

いくつかのサイトを検索して何かを得て、ここで共有したくなった

  1. Activity_main.xmlのIncludeタグにIDを追加

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

  2. MainActivity.javaのIDでビューを検索する前に、このレイアウトを呼び出します

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

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


-1

私があなたのところにいるなら、私はこれをします。onView(withId(android.R.id.list))。perform(RecyclerViewActions.scrollToPosition(3)); android.R.id.listをリストIDに変更すると、位置は配列内の位置になります。


-1

フラグメントを使用して

onCreateView()でコードを書く

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

活動を使用して

onCreate()でコードを書くRecyclerView recyVideo = findViewById(R.id.recyVideoFag);

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.