java.lang.IllegalStateException:RecyclerView在Fragment中没有LayoutManager

时间:2014-12-19 10:17:07

标签: android android-fragments android-5.0-lollipop android-recyclerview

我正在将Activity更改为Fragment,并在我将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布局中删除所有子元素有助于解决问题。但是我不明白为什么这会改变任何事情以及为什么它之前的工作与之前的工作有关。

WORKS

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

我在这里缺少什么?

5 个答案:

答案 0 :(得分:39)

这个问题已经很老了,但为了让人们仍然面对这个问题,我想我会留下答案。我刚学习Android开发,这个问题令人沮丧。后来我发现你不应该在RecyclerView下添加任何视图或查看组。您希望在RecyclerView下显示的布局需要在独立的资源文件中单独定义。

然后在适配器实现中(扩展RecyclerView.Adapter<>的实现(在覆盖的方法public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType)中),当您为视图的布局膨胀时(这会为回收器视图的每个项目的布局进行膨胀) ,您可以指定您创建的上述单独布局。然后Android会为需要添加到回收站视图的每个项目扩充此布局。

This article帮助我清楚地看到了这一点。

答案 1 :(得分:2)

当我尝试使用android-parallax-recycleview时,我遇到了同样的问题。

解决方案很简单,您可以手动创建布局管理器管理器。

来自example-parallaxrecycler的代码段:

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

答案 2 :(得分:1)

RecyclerViewViewGroup,需要LayoutManager才能对其子项进行布局。在您的情况下,RecyclerView需要将子视图传递给LayoutManager,但我不确定是否可以将View的xml参考传递给LayoutManager

答案 3 :(得分:1)

我最后只是像这样夸大观点:

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

答案 4 :(得分:0)

即使我在onCreateView初始化它仍然是空指针异常。

以编程方式添加它。

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