Estoy tratando de tener múltiples RecyclerViews en una presentación pero me sale el siguiente error: «LayoutManager ya está conectado a una RecyclerView»

El código Java es:

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

El XML de diseño de código es:

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

La MyLinearLayoutManager es una costumbre LinearLayoutManager he encontrado en internet con el fin de resolver el wrap-problema de contenido de la SDK de LinearLayoutManager.

Es hay alguna forma de que yo pueda tener múltiples RecyclerViews en un diseño único? Parece que no puedo adjuntar más de un LayoutManagers por diseño.

Cualquier ayuda sería muy bienvenida 🙂

  • Se puede actualizar con la fuente de la que LayoutManager?
  • He probado el SDK de LinearLayoutManager pero sigue el mismo error. Así que no es la costumbre LayoutManager el problema.
InformationsquelleAutor TheoK | 2015-05-29

7 Comentarios

  1. 69

    He tenido este problema también. Mi Actividad utiliza Pestañas, con tres fragmentos, cuando me vaya a la ficha de la tercera, y volver a la primera (o segunda), este error se produce.

    Después de buscar mucho, me enteré de que puede ser el recolector de basura, debido a que estaba usando una referencia fuerte.

    Desde el constructor LinearLayoutManager utiliza la actividad como el parámetro (no el fragmento), una de las Fichas de Actividad se mantiene activo durante pestañas cambios.

    Quitar el campo local en mLinearLayoutManager de la clase, y el uso de una referencia débil, podía deshacerse de este problema:

    antes:

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

    He cambiado a:

    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()));
    }
    }
    • debe ser la correcta respuesta, gracias!
    • No sólo funciona, también me las arreglé para cambiar el diseño basado en la elección del usuario, mientras que el fragmento que se muestra, simplemente haciendo clic en un botón.
    • Muchas gracias!
    • La Respuesta Perfecta 🙂
    • Perfecta Respuesta..Gracias:)
    • ¿hay otra manera ? porque tengo demasiado uso LayoutManager como un objeto global en mi fragmento
    • ok he encontrado la respuesta. Sólo tengo que llamar a recyclerView.getLayoutManager(). tks
    • Lo que si necesito LayoutManager como en mi Fragmento de la clase? Lo estoy usando para scrollListeners por ejemplo
    • Debemos usar un bindingAdapter en lugar de constructor de inicialización?

  2. 4

    Solo tienes que crear una nueva instancia:

    RecyclerView recyclerView = new RecyclerView(getContext());
    recyclerView.setLayoutManager(new LinearLayoutManager(getContext()))
  3. 2

    Me enfrenté a este error cuando la prestación de LayoutManager a través de Daga.
    La solución es reemplazar el gestor de diseño de la inyección con el gestor de diseño javax.inyectar.Proveedor de inyección.

    @Inject
    lateinit var layoutManager: Provider<RecyclerView.LayoutManager>
    ...
    recyclerView.setLayoutManager(layoutManager.get())
    • Woah gracias, por lo que el Proveedor hace uno nuevo cada vez get() se llama…hmm
    • Proveedor crea una nueva instancia de layoutManager
  4. 0

    Tengo el mismo problema así. Yo trabajo en torno al establecer el valor null para LinearLayoutManager instancia.

    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;
    }
  5. 0

    En mi caso, yo había declarado LinearLayoutManager a nivel mundial y yo estaba tratando de conectar a la misma instancia de LinearLayoutManager a varios RecyclerView's por lo que estaba recibiendo este error.

    La Solución es conectar diferentes LayoutManager a cada RecyclerView porque uno LayoutManager sólo puede ser conectado a una Recyclerview.

  6. 0

    Este error me enfrenté con Daggar2
    y simplemente eliminar mediante el uso de Proveedor antes de la LinearLayoutManager como;

     @Inject
    Provider <LinearLayoutManager> linearLayoutManager;
    mViewDataBinding.rvResult.setLayoutManager(linearLayoutManager.get());
  7. -8

    He resuelto el problema (en caso de que alguien se enfrenta de nuevo) siguiendo estos pasos:

    Limpieza del proyecto

    Del proyecto de reconstrucción

    Invalidar cachés

    Después de que he recopilado de nuevo y funciona como un encanto

    PS: no sé que uno de los tres pasos anteriores hizo el truco, ya que he intentado todos a la vez antes de la compilación. Si alguien lo enfrenta de nuevo e intenta estos pasos de uno en uno, por favor, el post que paso, en particular, es la solución para el problema.

    • No trabajo para mí, pero la aceptó responder trabajado
    • No tiene ningún sentido que este sea el aceptado la respuesta del problema con IllegalArgumentException. @WilliamK respuesta puede ayudarle a deshacerse del problema.
    • desde que ayudó a muchos usuarios WilliamK la respuesta que he cambiado la aceptó responder
    • Gracias Theok, buena elección, ya que esta Excepción ocurre cuando intenta volver a usar el mismo ejemplo de la LayoutManager con el segundo u otros RecyclerView y creo que la respuesta de arriba es haciendo exactamente esto

Dejar respuesta

Please enter your comment!
Please enter your name here