" LayoutManager已经附加到RecyclerView"错误

时间:2015-05-29 11:17:17

标签: android android-layout android-recyclerview

我正在尝试在布局中安装多个RecyclerViews,但是我收到以下错误:" LayoutManager已经附加到RecyclerView"

Java代码是:

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

    Activity parentActivity = getActivity();
    final ObservableScrollView scrollView = (ObservableScrollView) view.findViewById(R.id.squad_scrollview);

    final RecyclerView gkRecyclerView = (RecyclerView) view.findViewById(R.id.gk_recycler);
    final RecyclerView coachRecyclerView = (RecyclerView) view.findViewById(R.id.coach_recycler);

    coachRecyclerView.setAdapter(new SquadRecyclerAdapter(parentActivity, getSquadDummyData(0)));
    coachRecyclerView.setLayoutManager(new MyLinearLayoutManager(parentActivity, LinearLayoutManager.VERTICAL, false));
    coachRecyclerView.setHasFixedSize(false);

    gkRecyclerView.setAdapter(new SquadRecyclerAdapter(parentActivity, getSquadDummyData(1)));
    gkRecyclerView.setLayoutManager(new MyLinearLayoutManager(parentActivity, LinearLayoutManager.VERTICAL, false));
    gkRecyclerView.setHasFixedSize(false);

    scrollView.setTouchInterceptionViewGroup((ViewGroup) parentActivity.findViewById(R.id.container));

    if (parentActivity instanceof ObservableScrollViewCallbacks) {
        scrollView.setScrollViewCallbacks((ObservableScrollViewCallbacks) parentActivity);
    }

    return view;
}

XML布局代码是:

<com.github.ksoichiro.android.observablescrollview.ObservableScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/squad_scrollview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="@dimen/margin_medium"
    >

    <LinearLayout
        android:id="@+id/squad_container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/seasons_scrollview"
        android:divider="@drawable/nav_bar_divider"
        android:elevation="@dimen/card_elevation"
        android:orientation="vertical"
        android:showDividers="middle">

        <LinearLayout
            android:id="@+id/coach_group"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:paddingBottom="@dimen/margin_small"
            android:paddingLeft="@dimen/margin_standard"
            android:paddingRight="@dimen/margin_standard"
            android:paddingTop="@dimen/margin_small">

            <TextView
                android:id="@+id/squad_coach_header"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Coach"
                android:textSize="@dimen/text_size_standard" />

            <android.support.v7.widget.RecyclerView
                android:id="@+id/coach_recycler"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:paddingTop="@dimen/margin_small"
                android:paddingBottom="@dimen/margin_small"
                android:scrollbars="none">

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

        </LinearLayout>

        <LinearLayout
            android:id="@+id/gk_group"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:paddingBottom="@dimen/margin_small"
            android:paddingLeft="@dimen/margin_standard"
            android:paddingRight="@dimen/margin_standard"
            android:paddingTop="@dimen/margin_small">

            <TextView
                android:id="@+id/squad_gk_header"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Goalkeepers"
                android:textSize="@dimen/text_size_standard" />

            <android.support.v7.widget.RecyclerView
                android:id="@+id/gk_recycler"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:paddingTop="@dimen/margin_small"
                android:paddingBottom="@dimen/margin_small"
                android:scrollbars="none">

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

        </LinearLayout>

        <LinearLayout
            android:id="@+id/def_group"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:paddingBottom="@dimen/margin_small"
            android:paddingLeft="@dimen/margin_standard"
            android:paddingRight="@dimen/margin_standard"
            android:paddingTop="@dimen/margin_small">

            <TextView
                android:id="@+id/squad_def_header"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Defense"
                android:textSize="@dimen/text_size_standard" />

        </LinearLayout>

        <LinearLayout
            android:id="@+id/mid_group"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:paddingBottom="@dimen/margin_small"
            android:paddingLeft="@dimen/margin_standard"
            android:paddingRight="@dimen/margin_standard"
            android:paddingTop="@dimen/margin_small">

            <TextView
                android:id="@+id/squad_mid_header"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Midfielders"
                android:textSize="@dimen/text_size_standard" />

        </LinearLayout>

        <LinearLayout
            android:id="@+id/for_group"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:paddingBottom="@dimen/margin_small"
            android:paddingLeft="@dimen/margin_standard"
            android:paddingRight="@dimen/margin_standard"
            android:paddingTop="@dimen/margin_small">

            <TextView
                android:id="@+id/squad_for_header"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Forwards"
                android:textSize="@dimen/text_size_standard" />

        </LinearLayout>


    </LinearLayout>


</com.github.ksoichiro.android.observablescrollview.ObservableScrollView>

MyLinearLayoutManager是我在网上找到的自定义LinearLayoutManager,用于解决SDK LinearLayoutManager的包装内容问题。

有什么办法可以在一个布局中安装多个RecyclerViews吗?我似乎无法为每个布局附加多个LayoutManagers。

非常欢迎任何帮助:)

9 个答案:

答案 0 :(得分:66)

我也有这个问题。我的Activity使用Tabs,有三个片段,当我转到第三个标签,然后回到第一个(或第二个)时,会抛出此错误。

经过大量搜索后,我发现可能是垃圾收集器,因为我使用了强大的参考资料。

由于构造函数LinearLayoutManager使用activity作为参数(而不是片段),因此Tabs Activity在标签更改期间保持活动状态。

从类中删除mLinearLayoutManager中的本地字段,并使用弱引用,我可以摆脱这个问题:

之前:

public class MyFragment1 extends Fragment
    private LinearLayoutManager linearLayoutManager;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        linearLayoutManager = new LinearLayoutManager(getActivity());
        (...)
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
        (...)
        mRecyclerView.setLayoutManager(linearLayoutManager);
    }
}

我改为:

public class MyFragment1 extends Fragment {
    // private LinearLayoutManager linearLayoutManager;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        // linearLayoutManager = new LinearLayoutManager(getActivity());
        (...)
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        (...)
        mRecyclerView.setLayoutManager(
           new LinearLayoutManager(getActivity()));
    }
}

答案 1 :(得分:3)

只需要创建一个新实例:

export class MyDialogComponent implements OnInit {
  // Rename the property to whatever you want it to be
  dialogConfig: MatDialogConfig;
  ngOnInit() {
    console.dir(`Dialog config: ${this.dialogConfig}`);
  }
}

答案 2 :(得分:1)

通过 Dagger 提供LayoutManager时遇到此错误。
解决方案是将布局管理器注入替换为布局管理器 javax.inject.Provider 注入。

@Inject
lateinit var layoutManager: Provider<RecyclerView.LayoutManager>

...

recyclerView.setLayoutManager(layoutManager.get())

答案 3 :(得分:0)

我也有同样的问题。我通过将null设置为LinearLayoutManager实例来解决它。

public class MyFragment extends Fragment {
protected LinearLayoutManager mLinearLayoutManager;
...

@Override
public void onDestroy() {
    super.onDestroy();
    if(mLinearLayoutManager != null) // Workaround: android.support.v7.widget.LinearLayoutManager is already attached to a RecyclerView
        mLinearLayoutManager = null;
}

答案 4 :(得分:0)

在我的情况下,我全局声明了LinearLayoutManager,并且试图将LinearLayoutManager的相同实例附加到多个RecyclerView's,所以我遇到了这个错误。

解决方案是将不同的LayoutManager附加到每个RecyclerView,因为一个LayoutManager只能附加到一个Recyclerview

答案 5 :(得分:0)

Daggar2遇到此错误 并只需在LinearLayoutManager之类的位置使用Provider即可删除;

 @Inject

 Provider <LinearLayoutManager> linearLayoutManager;

 mViewDataBinding.rvResult.setLayoutManager(linearLayoutManager.get());

答案 6 :(得分:0)

我在Dagger2中遇到了这个问题,并且通过删除范围注释解决了。 我已经在某些范围内注释了代码,而在删除范围时,此问题已解决。 希望对您有帮助。

@MyScope @Provides static LinearLayoutManager provideLinearLayoutManager

我删除了@MyScope

答案 7 :(得分:0)

我从 FragmentA 打开了 FragmentB。然后返回到 FragmentA 并得到这个异常。我发现了一个错误。我在 onCreate 创建:

linearLayoutManager = LinearLayoutManager(requireContext())

并在其中使用onCreateView

view.recycler_view.layoutManager = linearLayoutManager

因为当我们从 FragmentB 返回时 linearLayoutManager 没有重新创建,RecyclerView 使用了旧的 linearLayoutManager。因此,我将 linearLayoutManager = LinearLayoutManager(requireContext()) 移至 onCreateView

答案 8 :(得分:-7)

我通过以下步骤解决了问题(如果有人再次面对它):

清理项目

重建项目

使缓存无效

之后我再次编译,它像魅力一样运行

PS:我不知道上面三个步骤中的哪一个做了这个伎俩,因为我在编译之前一次尝试了所有这些步骤。如果有人再次面对它并一次尝试这些步骤,请发布哪个步骤特别是该问题的解决方案。