"LayoutManager is already attached to a RecyclerView" 错误
"LayoutManager is already attached to a RecyclerView" error
我试图在一个布局中使用多个 RecyclerView,但出现以下错误:"LayoutManager is already attached to a 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的wrap-content问题
有什么方法可以让我在一个布局中拥有多个 RecyclerView?似乎我不能为每个布局附加一个以上的 LayoutManager。
非常欢迎任何帮助:)
我也有这个问题。我的 Activity 使用带有三个片段的选项卡,当我转到第三个选项卡并返回到第一个(或第二个)选项卡时,会抛出此错误。
查了很多,发现可能是垃圾收集器,因为我用的是强引用
由于构造函数 LinearLayoutManager 使用 activity 作为参数(而不是片段),Tabs Activity 在选项卡更改期间保持活动状态。
从 class 中删除 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()));
}
}
我也遇到了同样的问题。我通过将 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;
}
只需要创建一个新实例:
RecyclerView recyclerView = new RecyclerView(getContext());
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()))
我在通过 Dagger 提供 LayoutManager 时遇到了这个错误。
解决办法是用layout manager javax.inject.Provider注入代替layout manager注入
@Inject
lateinit var layoutManager: Provider<RecyclerView.LayoutManager>
...
recyclerView.setLayoutManager(layoutManager.get())
在我的例子中,我已经全局声明了一个 LinearLayoutManager
并且我试图将 LinearLayoutManager
的同一个实例附加到多个 RecyclerView's
所以我得到了这个错误。
解决方案是将不同的 LayoutManager
附加到每个 RecyclerView
,因为一个 LayoutManager 只能附加到一个 Recyclerview
。
这个错误是我在 Daggar2 上遇到的
并简单地通过在 LinearLayoutManager 之前使用 Provider 来删除;
@Inject
Provider <LinearLayoutManager> linearLayoutManager;
mViewDataBinding.rvResult.setLayoutManager(linearLayoutManager.get());
我在使用 Dagger2 时遇到了这个问题,通过删除范围注释解决了这个问题。
我用一些范围注释了代码,当我删除范围时,问题就解决了。
希望对您有所帮助。
@MyScope @Provides static LinearLayoutManager provideLinearLayoutManager
我删除了 @MyScope
.
我从 FragmentA 打开了 FragmentB。然后返回到 FragmentA 并得到这个异常。我发现了一个错误。我创建于 onCreate
:
linearLayoutManager = LinearLayoutManager(requireContext())
并在其中使用 onCreateView
:
view.recycler_view.layoutManager = linearLayoutManager
因为当我们从 FragmentB 返回时 linearLayoutManager
没有重新创建,RecyclerView
使用旧的 linearLayoutManager
。所以,我将 linearLayoutManager = LinearLayoutManager(requireContext())
移动到 onCreateView
。
修复此崩溃的可能选项:
- 在
Fragment
的 onViewCreated
中创建 LayoutManager
的实例:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
recyclerView.layoutManager = LinearLayoutManager(context)
}
- 如果需要
LayoutManager
的实例作为Fragment
中的变量,则在onDestroyView
中将实例从RecyclerView
分离:
class MyFragment : Fragment() {
private val myLayoutManager by lazy { LinearLayoutManager(context) }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
recyclerView.layoutManager = myLayoutManager
}
override fun onDestroyView() {
recyclerView.layoutManager = null
super.onDestroyView()
}
}
第二个选项会起作用,因为抛出异常的条件将为假。这是 RecyclerView
的方法 setLayoutManager
中的代码:
...
if (layout != null) {
if (layout.mRecyclerView != null) { // will be false
throw new IllegalArgumentException("LayoutManager " + layout
+ " is already attached to a RecyclerView:"
+ layout.mRecyclerView.exceptionLabel());
}
mLayout.setRecyclerView(this);
if (mIsAttached) {
mLayout.dispatchAttachedToWindow(this);
}
}
我试图在一个布局中使用多个 RecyclerView,但出现以下错误:"LayoutManager is already attached to a 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的wrap-content问题
有什么方法可以让我在一个布局中拥有多个 RecyclerView?似乎我不能为每个布局附加一个以上的 LayoutManager。
非常欢迎任何帮助:)
我也有这个问题。我的 Activity 使用带有三个片段的选项卡,当我转到第三个选项卡并返回到第一个(或第二个)选项卡时,会抛出此错误。
查了很多,发现可能是垃圾收集器,因为我用的是强引用
由于构造函数 LinearLayoutManager 使用 activity 作为参数(而不是片段),Tabs Activity 在选项卡更改期间保持活动状态。
从 class 中删除 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()));
}
}
我也遇到了同样的问题。我通过将 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;
}
只需要创建一个新实例:
RecyclerView recyclerView = new RecyclerView(getContext());
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()))
我在通过 Dagger 提供 LayoutManager 时遇到了这个错误。
解决办法是用layout manager javax.inject.Provider注入代替layout manager注入
@Inject
lateinit var layoutManager: Provider<RecyclerView.LayoutManager>
...
recyclerView.setLayoutManager(layoutManager.get())
在我的例子中,我已经全局声明了一个 LinearLayoutManager
并且我试图将 LinearLayoutManager
的同一个实例附加到多个 RecyclerView's
所以我得到了这个错误。
解决方案是将不同的 LayoutManager
附加到每个 RecyclerView
,因为一个 LayoutManager 只能附加到一个 Recyclerview
。
这个错误是我在 Daggar2 上遇到的 并简单地通过在 LinearLayoutManager 之前使用 Provider 来删除;
@Inject
Provider <LinearLayoutManager> linearLayoutManager;
mViewDataBinding.rvResult.setLayoutManager(linearLayoutManager.get());
我在使用 Dagger2 时遇到了这个问题,通过删除范围注释解决了这个问题。 我用一些范围注释了代码,当我删除范围时,问题就解决了。 希望对您有所帮助。
@MyScope @Provides static LinearLayoutManager provideLinearLayoutManager
我删除了 @MyScope
.
我从 FragmentA 打开了 FragmentB。然后返回到 FragmentA 并得到这个异常。我发现了一个错误。我创建于 onCreate
:
linearLayoutManager = LinearLayoutManager(requireContext())
并在其中使用 onCreateView
:
view.recycler_view.layoutManager = linearLayoutManager
因为当我们从 FragmentB 返回时 linearLayoutManager
没有重新创建,RecyclerView
使用旧的 linearLayoutManager
。所以,我将 linearLayoutManager = LinearLayoutManager(requireContext())
移动到 onCreateView
。
修复此崩溃的可能选项:
- 在
Fragment
的onViewCreated
中创建LayoutManager
的实例:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
recyclerView.layoutManager = LinearLayoutManager(context)
}
- 如果需要
LayoutManager
的实例作为Fragment
中的变量,则在onDestroyView
中将实例从RecyclerView
分离:
class MyFragment : Fragment() {
private val myLayoutManager by lazy { LinearLayoutManager(context) }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
recyclerView.layoutManager = myLayoutManager
}
override fun onDestroyView() {
recyclerView.layoutManager = null
super.onDestroyView()
}
}
第二个选项会起作用,因为抛出异常的条件将为假。这是 RecyclerView
的方法 setLayoutManager
中的代码:
...
if (layout != null) {
if (layout.mRecyclerView != null) { // will be false
throw new IllegalArgumentException("LayoutManager " + layout
+ " is already attached to a RecyclerView:"
+ layout.mRecyclerView.exceptionLabel());
}
mLayout.setRecyclerView(this);
if (mIsAttached) {
mLayout.dispatchAttachedToWindow(this);
}
}