web-dev-qa-db-fra.com

Erreur "LayoutManager est déjà attaché à un RecyclerView"

J'essaie d'avoir plusieurs RecyclerViews dans une mise en page mais j'obtiens l'erreur suivante: "LayoutManager est déjà attaché à une RecyclerView"

Le code Java est:

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

Le code de mise en page XML est:

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

Le MyLinearLayoutManager est un LinearLayoutManager personnalisé que j'ai trouvé en ligne afin de résoudre le problème de contenu enveloppant du SDK LinearLayoutManager.

Existe-t-il un moyen de disposer de plusieurs RecyclerViews dans une même mise en page? Il semble que je ne puisse pas attacher plus d'un LayoutManagers par mise en page.

Toute aide serait la bienvenue :)

32
TheoK

J'ai eu ce problème également. Mon activité utilise des onglets, avec trois fragments, lorsque je passe au troisième onglet et que je reviens au premier (ou second), cette erreur est levée.

Après avoir beaucoup cherché, j'ai découvert que c'était peut-être le garbage collector, car j'utilisais une référence forte.

Étant donné que le constructeur LinearLayoutManager utilise l'activité comme paramètre (et non le fragment), une activité Tabs reste active pendant les changements d'onglets.

En supprimant le champ local dans mLinearLayoutManager de la classe et en utilisant une référence faible, je pourrais me débarrasser de ce problème:

avant:

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

J'ai changé pour:

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()));
    }
}
69
WilliamK

Il suffit de créer une nouvelle instance:

RecyclerView recyclerView = new RecyclerView(getContext());
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()))
4
Victor Ruiz C.

J'ai rencontré cette erreur lors de la fourniture de LayoutManager via Dagger.
La solution consiste à remplacer l'injection du gestionnaire de disposition par le gestionnaire de disposition javax.inject.Provider injection.

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

...

recyclerView.setLayoutManager(layoutManager.get())
2
Mikhail Sharin

J'ai aussi le même problème. Je contourne ce problème en définissant null sur l'instance 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;
}
0
yinsweet

J'ai rencontré cette erreur avec Daggar2 et je l'ai simplement supprimée en utilisant Provider avant le LinearLayoutManager comme;

 @Inject

 Provider <LinearLayoutManager> linearLayoutManager;

 mViewDataBinding.rvResult.setLayoutManager(linearLayoutManager.get());
0
Arun Prajapati

Dans mon cas, j'avais déclaré un LinearLayoutManager globalement et j'essayais de joindre la même instance de LinearLayoutManager à plusieurs RecyclerView's donc j'obtenais cette erreur.

La solution consiste à attacher différents LayoutManager à chaque RecyclerView car un LayoutManager ne peut être attaché qu'à un Recyclerview.

0
nimi0112