【发布时间】:2021-12-16 12:57:02
【问题描述】:
已创建 tabLayout 和 pager2
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
myFragment = inflater.inflate(R.layout.fragment_home, container, false);
tabLayout = myFragment.findViewById(R.id.tab_layout);
pager2 = myFragment.findViewById(R.id.view_pager2);
Button calculate = myFragment.findViewById(R.id.calculate_button);
FragmentManager fm = getFragmentManager();
adapter = new FragmentAdapterRecycler(fm, getLifecycle());
pager2.setAdapter(adapter);
位于onCreateView中:如果页面滑动,那么调用fillFragement()时RecyclerView会正常填充如果先点击tab,那么fillFragment()中的RecyclerView会因为java导致程序崩溃.lang.NullPointerException:
pager2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
@Override
public void onPageSelected(int position) {
calc = (TextView) myFragment.findViewById(R.id.numDisplay);
fillFragment(pager2.getCurrentItem());
tabLayout.selectTab(tabLayout.getTabAt(position));
}
});
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
pager2.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) { }
@Override
public void onTabReselected(TabLayout.Tab tab) { }
});
fillFragment() 这会定位 RecyclerView 并根据所选页面填充它。每个页面都有自己的 RecyclerView。
public void fillFragment(int position) {
if (position == 0 && isChosen) {
String iterations = "Total Iterations: " + collatz.getIterationTotal();
calc.setText(iterations);
if (tabLoaded1 == false) {
mRecyclerView = (RecyclerView) getView().findViewById(R.id.recycler_view);
mRecyclerView.setHasFixedSize(false);
mLayoutManager = new LinearLayoutManager(getActivity());
mAdapter = new CollatzAdapter(collatz.getCollatzList());
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.setAdapter(mAdapter);
tabLoaded1 = true;
}
}
if (position == 1 && isChosen) {
String evenTotal = "Total Even: " + collatz.getEvenTotal();
calc.setText(evenTotal);
if (tabLoaded2 == false) {
mRecyclerView = (RecyclerView) myFragment.findViewById(R.id.recycler_view_even);
mRecyclerView.setHasFixedSize(false);
mLayoutManager = new LinearLayoutManager(getActivity());
mAdapter = new CollatzAdapter(collatz.getEvenList());
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.setAdapter(mAdapter);
tabLoaded2 = true;
}
}
if (position == 2 && isChosen) {
String oddTotal = "Total Odd: " + collatz.getOddTotal();
calc.setText(oddTotal);
if (tabLoaded3 == false) {
mRecyclerView = (RecyclerView) myFragment.findViewById(R.id.recycler_view_odd);
mRecyclerView.setHasFixedSize(false);
mLayoutManager = new LinearLayoutManager(getActivity());
mAdapter = new CollatzAdapter(collatz.getOddList());
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.setAdapter(mAdapter);
tabLoaded3 = true;
}
}
}
总而言之,当调用 fillFragment() 时,单击选项卡会导致空对象引用。滑动页面时它工作正常。这是因为单击选项卡时,会在创建 Pager2 项之前首先调用 fillFragment()。滑动时先创建Pager2项,然后调用fillFragment(),即先创建RecyclerView再访问。
如果 pageView 总是在我填充它导致空对象引用后创建,我如何在单击选项卡时填充 RecyclerView?
【问题讨论】:
-
你能发布堆栈跟踪吗?
-
java.lang.NullPointerException: 尝试在空对象引用上调用虚拟方法 'void androidx.recyclerview.widget.RecyclerView.setHasFixedSize(boolean)'
-
对于职位 1,您有
getView(),但对于其他职位,您有myFragment,这是故意的吗? -
我在尝试不同的东西。我忘记改回来了。它仍然有效,但它们应该都是一样的。
-
布局中是否真的有 3 个不同的
RecyclerViewsR.layout.fragment_homeR.id.recycler_view_odd,R.id.recycler_view_even,R.id.recycler_view这看起来很奇怪?
标签: android android-studio android-layout android-fragments android-viewpager2