RecyclerView填充时出现‘无LayoutManager’错误,求解决方案
RecyclerView "has no LayoutManager" 错误修复方案
问题背景
开发中为RecyclerView创建独立XML文件时遇到RecyclerView has no LayoutManager错误,任务要求需包含以下逻辑:
- 在MainActivity中创建MusicStoreService单例并提供getter方法
- 在ProductListFragment中通过父Activity获取该Service实例
- 将Service传入ProductListAdapter的构造方法
核心错误分析
MainActivity布局逻辑错误
直接将product_list_fragment.xml(内部为RecyclerView)设为Activity布局,同时尝试将ProductListFragment添加到该RecyclerView的ID上。系统会尝试在RecyclerView容器中加载Fragment,此时RecyclerView尚未设置LayoutManager,触发异常。Fragment onCreateView返回值错误
在onCreateView中手动inflated布局并设置了LayoutManager和Adapter,但最后返回的是super.onCreateView(...)而非自己创建的View实例,导致所有设置失效,系统重新inflated布局时找不到LayoutManager。onViewCreated冗余代码
该方法中重新创建Adapter并设置,不仅覆盖了之前的配置,还使用了新的MusicStoreServiceMock实例,违反了从MainActivity获取Service的任务要求。
修复步骤
1. 修正MainActivity布局与逻辑
创建主布局main.xml作为Fragment容器,替换错误的setContentView调用,确保Fragment添加到正确容器中。
2. 修正ProductListFragment的View返回与冗余代码
- 在
onCreateView中返回自己inflated的View实例 - 删除
onViewCreated中重新设置Adapter的代码,确保使用从MainActivity获取的Service实例
修改后的代码
MainActivity.java
public class MainActivity extends AppCompatActivity { MusicStoreService music; public MainActivity() { super(R.layout.main); System.out.println("MS2021: MainActivity/"+"MainActivity".hashCode()+": MainActivity() - created"); } @Nullable @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); music = new MusicStoreServiceMock(); setContentView(R.layout.main); // 使用主布局作为Fragment容器 if (savedInstanceState == null) { System.out.println("MS2021: MainActivity/" + "MainActivity".hashCode() + " onCreate()"); getSupportFragmentManager().beginTransaction() .setReorderingAllowed(true) .add(R.id.fragment_container, ProductListFragment.class, null) .commit(); System.out.println(); } } public MusicStoreService getMusic() { return music; } }
新增main.xml布局
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/fragment_container" android:layout_width="match_parent" android:layout_height="match_parent" />
修改后的ProductListFragment.java
public class ProductListFragment extends Fragment { RecyclerView recyclerView; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View v = inflater.inflate(R.layout.product_list_fragment, container, false); recyclerView = v.findViewById(R.id.productlist_recycler); recyclerView.setHasFixedSize(true); RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext()); recyclerView.setLayoutManager(layoutManager); try { // 从MainActivity获取Service实例传入Adapter recyclerView.setAdapter(new ProductListAdapter(((MainActivity) getActivity()).getMusic())); } catch (FileNotFoundException e) { e.printStackTrace(); } return v; // 返回自己创建的View实例 } }
内容的提问来源于stack exchange,提问作者ShinyStar MaybeNot
相关产品推荐
相关产品推荐

