在我的许多应用中,我一直遇到一个反复出现的问题,并且一直在使用各种各样的工作来解决"它,但这次我已经拥有它,我想找出一个真正的解决方案。
我正在尝试使用两个标签构建标签式布局,其中每个标签显示应从互联网获取的一些数据。获得数据后,它会缓存在设备上,以便下次打开应用程序时立即恢复(然后在后台刷新)。
为此,我尝试加载缓存的数据并在第一个选项卡的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
中创建视图,然后在onViewCreated
中获取RecyclerView,最后使用适配器设置项目。
问题很简单:MainActivity中的方法setCachedItems
在之前称为,在片段中调用onCreateView
或onViewCreated
方法。因此,RecyclerView
为空,我无法设置其适配器。即使我在创建一个新的Fragments实例并在调用该方法之前将它们添加到一个功能性的TabLayout中。
在创建视图之前似乎有一些延迟,但我需要在创建活动时设置项目。
我哪里出错,我该如何解决?
答案 0 :(得分:0)
在片段的onViewCreated中执行此操作
((MainActivity)getActivity).setCachedData().....
而不是创建活动