dagger recyclerview layoutmanager 注入

Sam*_*net 1 android dagger-2

我正在尝试使用片段中的匕首注入 recyclerview layoutmanager,问题是当我返回到包含该注入的片段时,我得到了另一个 recyclerview 已经在使用 layoutmanager 的错误原因。实际上离开片段销毁片段视图并回到它只重新创建片段视图而不是片段实例本身,因此布局管理器注入仍然是同一个实例。这是我的代码,使事情更清楚:

从活动模块:

@PerFragment
@ContributesAndroidInjector( modules = ProductListFragmentModule.class )
abstract ProductListFragment contributeProductListFragment( );
Run Code Online (Sandbox Code Playgroud)

ProductListFragmentModule 匕首模块

@Provides
@PerFragment
public static RecyclerView.LayoutManager provideProductListLayoutManager(
        @ActivityContext Context context,
        FlexibleAdapter< AbstractFlexibleItem< ? extends BaseViewHolder > > flexibleAdapter )
{
    int totalSpanSize = 6;
    GridLayoutManager gridLayoutManager = new GridLayoutManager( context,
                                                                 totalSpanSize,
                                                                 LinearLayoutManager.VERTICAL,
                                                                 false );

    gridLayoutManager.setSpanSizeLookup( new GridLayoutManager.SpanSizeLookup( )
    {
        @Override
        public int getSpanSize( int position )
        {
            IFlexible item = flexibleAdapter.getItem( position );

            if( item != null && item instanceof GridLayoutItem )
                return ( ( GridLayoutItem ) item ).getSpanSize( totalSpanSize );

            return totalSpanSize;
        }
    } );

    return gridLayoutManager;
}
Run Code Online (Sandbox Code Playgroud)

从 ProductListFragment 类:

@BindView( R.id.list )
RecyclerView mList;
@Inject
RecyclerView.LayoutManager mLayoutManager;

...


@Override
public void onActivityCreated( @Nullable Bundle savedInstanceState )
{
     mList.setLayoutManager( mLayoutManager );
}
Run Code Online (Sandbox Code Playgroud)

因此,正如我所说的第一次创建片段没有问题,但是当离开片段并返回(使用 backstack)时,出现了关于 layoutmanager 已经附加到 recyclerview 的错误。

我想保持 layoutmanager 注入并避免从我的片段创建实例,无论如何要这样做吗?我正在考虑每个片段视图都有一个匕首范围以及每个活动/每个片段范围的标准,但无法弄清楚如何做到这一点。

感谢您提供任何建议。

mpo*_*tus 5

我在注入到 ViewPager 中的片段时遇到了类似的问题。对我有用的解决方案之一可能适用于您的情况。

从模块中删除 @PerFragment 注释以确保每当请求时都会创建 LayoutManager 的新实例:

@Provides
public static RecyclerView.LayoutManager provideProductListLayoutManager() {...}
Run Code Online (Sandbox Code Playgroud)

注入 RecyclerView.LayoutManager 的提供者而不是实例:

@Inject
Provider<RecyclerView.LayoutManager> mLayoutManager;
Run Code Online (Sandbox Code Playgroud)

每次附加片段时使用提供程序实例化布局管理器:

mList.setLayoutManager(mLayoutManager.get());
Run Code Online (Sandbox Code Playgroud)

我在 ViewPager 中面临的问题是通过使用 FragmentStatePagerAdapter instaed of FragmentPagerAdapter 解决的

这归结为没有缓存片段实例,并确保每个片段生命周期只调用一次 onCreateView。