我在我的许多应用程序中不断遇到一个反复出现的问题,并且一直在使用各种变通方法来“解决”它,但这次我已经遇到了,我想找出一个真正的解决方案。
我正在尝试使用两个选项卡构建一个选项卡式布局,其中每个选项卡显示一些应从 Internet 获取的数据。获取数据后,它会缓存在设备上,以便下次打开应用程序时立即恢复(然后在后台刷新)。
为此,我试图加载缓存的数据并将其显示在第一个选项卡的 RecyclerView 中,我想在活动创建时执行此操作。在我这样做之前,我显然设置了所有选项卡布局的东西,以便正确加载选项卡。问题是它们不是,组成标签页的片段似乎还没有它们的视图,因此我无法访问它们上的 RecyclerView。
这是我的活动代码:
public class MainActivity extends NetworkBusActivity
{
// Views
ViewPager tabPager;
TabLayout tabLayout;
// Tab pager adapter
private ViewPagerAdapter adapter;
// Fragment one and two
private MenuFragment menuFragment;
private OrderFragment orderFragment;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Create the views
tabPager = (ViewPager) findViewById(R.id.tabPager);
tabLayout = (TabLayout) findViewById(R.id.tabLayout);
// Setup the tab layouts
this.setupTabs();
// Show cached data
this.setCachedItems();
// Start loading new data in background
this.startLoading();
}
private void setupTabs()
{
// Create Fragments
menuFragment = new MenuFragment();
orderFragment = new OrderFragment();
// Setup adapter
adapter = new ViewPagerAdapter(getSupportFragmentManager());
adapter.addFragment(menuFragment, getString(R.string.title_menu));
adapter.addFragment(orderFragment, getString(R.string.title_orders));
tabPager.setAdapter(adapter);
// Setup the tab layout
tabLayout.setupWithViewPager(tabPager);
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener()
{
// not shown
});
}
private void setCachedItems()
{
// Show cached data
ArrayList<Item> items = Cache.menu.getItems();
menuFragment.setItems(items);
}
private void startLoading()
{
// Start loading in background (not shown)
}
}
它应该很简单:创建视图、创建片段、设置选项卡布局,然后加载缓存的数据。
MenuFragment
扩展了ItemListFragment
定义方法的基类setItems
:
public class MenuFragment extends ItemListFragment
{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.tab_menu, container, false);
return view;
}
@Override
protected ItemListAdapter getAdapter(ArrayList<Item> items, boolean categorize)
{
return new MenuListAdapter(this, R.layout.row_item, items, categorize);
}
}
public abstract class ItemListFragment extends Fragment
{
private RecyclerView recycler;
@Override
public void onViewCreated(View view, Bundle savedInstanceState)
{
super.onViewCreated(view, savedInstanceState);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
recycler = (RecyclerView) view;
recycler.setLayoutManager(linearLayoutManager);
recycler.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST));
}
public void setItems(ArrayList<Item> items)
{
recycler.setAdapter(getAdapter(items, true));
}
protected abstract ItemListAdapter getAdapter(ArrayList<Item> items, boolean categorize);
}
再次简单:在 中创建视图onCreateView
,然后在 中获取 RecyclerView onViewCreated
,最后使用适配器设置项目。
问题很简单:setCachedItems
MainActivity 中的方法在 Fragments 中的or方法被调用之前被调用。因此,它是空的,我不能设置它的适配器。即使我在调用该方法之前创建了 Fragments 的新实例并将它们添加到功能 TabLayout 中。onCreateView
onViewCreated
RecyclerView
在创建视图之前似乎有一些延迟,但我需要在创建活动时已经设置项目。
我哪里出错了,我该如何解决?