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 :)
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()));
}
}
Il suffit de créer une nouvelle instance:
RecyclerView recyclerView = new RecyclerView(getContext());
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()))
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())
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;
}
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());
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
.