web-dev-qa-db-ja.com

java.lang.IllegalStateException:RecyclerViewのFragmentにLayoutManagerがありません

私はアクティビティをフラグメントに変更している最中で、RecyclerViewを拡張するとすぐに次のエラーが発生しました。

@Override
public View onCreateView(LayoutInflater inflater, 
          ViewGroup container, Bundle savedInstanceState) {

    ----> View rootView = inflater.inflate(R.layout.layout_containing_recyclerview, 
                    container, false); 

Java.lang.IllegalStateException:RecyclerViewにはLayoutManagerがありません

アクティビティをフラグメントに変更する前に、インフレートはうまくいきました。

さらなる調査の結果、recyclerviewレイアウトからすべての子要素を削除するが問題の解決に役立つことがわかりました。しかし、なぜそれが何かを変えるのか、なぜそれが以前の活動で機能したのか理解できません。

[〜#〜]機能[〜#〜]

<Android.support.v7.widget.RecyclerView xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:id="@+id/my_recycler_view"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:clickable="true"   
    Android:scrollbars="vertical" >    

</Android.support.v7.widget.RecyclerView>

機能しません

<Android.support.v7.widget.RecyclerView xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:id="@+id/my_recycler_view"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:clickable="true"   
    Android:scrollbars="vertical" >    


<View
    Android:id="@+id/randomview"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_gravity="center" />

</Android.support.v7.widget.RecyclerView>

ここに欠けているものはありますか?

14
Edward van Raak

この質問はかなり古いですが、この問題にまだ直面している人々のために、私は答えを残したいと思いました。私はAndroid開発を学習していて、この問題はイライラさせられました。後で、RecyclerViewの下にビューまたはビューグループを追加するべきではないことがわかりました。 RecyclerViewの下に表示する場合は、独立したリソースファイルで個別に定義する必要があります。

次に、アダプターの実装(_RecyclerView.Adapter<>_を拡張する実装)で、オーバーライドされたメソッドpublic MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType)で、ビューのレイアウトを拡張すると(これにより、リサイクラービューの各アイテムのレイアウトが拡張されます)、上記で作成した個別のレイアウトを指定できます。Android次に、リサイクラービューに追加する必要があるすべてのアイテムに対してこのレイアウトを拡張します。

この記事 は、これを明確に見るのに役立ちました。

46
Suhas

Android-parallax-recycleview を使用しようとしたときにも同じ問題が発生しました。

解決策は簡単で、レイアウトマネージャーマネージャーを手動で作成できます。

example-parallaxrecycler からのコードスニペット:

LinearLayoutManager manager = new LinearLayoutManager(this);
manager.setOrientation(LinearLayoutManager.VERTICAL);
myRecycler.setLayoutManager(manager);
2
Walid Ammar

RecyclerViewは、子のレイアウトを行うViewGroupを必要とするLayoutManagerです。あなたの場合、RecyclerViewは子ビューをLayoutManagerに渡す必要がありますが、ビューのxml参照をLayoutManagerに渡すことができるかどうかはわかりません。

2

その後、次のようにビューを膨らませることになりました。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {      
    View rootView = inflater.inflate(R.layout.fragment_catalog_viewer, container, false);
    recyclerView = (RecyclerView)rootView.findViewById(R.id.my_recycler_view);
    getLayoutInflater(savedInstanceState).inflate(R.layout.catalog_child, container);        
    return rootView;
}
1
Edward van Raak

onCreateViewで初期化しても、依然としてnullポインタ例外が発生します。

プログラムで追加します。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/llContainer"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="vertical" >

  <!-- <Android.support.v7.widget.RecyclerView
        Android:id="@+id/rvPromotions"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent" />  -->

</LinearLayout>


    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

...
    // create recyclerview
...
            LinearLayout llContainer = (LinearLayout)  v.findViewById(R.id.llContainer);
            llContainer.addView(recyclerView);

            return v;
        }
0
Biro Csaba