我的个人Android应用程序出现问题,让我发疯。
我的活动包含 PagerSlidingTabStrip ,该活动由 FragmentPagerAdapter 和 4个固定标签组成,如下图所示。
第一个选项卡是一种摘要,它报告在以下选项卡上完成的选择项目(图像中的2,3和4)。每个ListFragment都在FragmentAdapter的 getItem 方法上实例化,并在每个ListFragment加载时运行此代码:
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// Set adapter and options
setListAdapter(mAdapter);
getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
// Code omitted
// currentSelection is a field set by a method on the ListFragment
// Load selection
setSelectedItem(currentSelection);
}
public void setSelectedItem(int val) {
// Check if the ListView exists
if (getActivity() != null) {
// Set selection
try {
getListView().setItemChecked(val - 1, true);
} catch (Exception e) {
Log.e("myapp", "Exception while setting selection!");
}
}
}
所以基本上我在ListFragment上调用一个方法,它将 currentSelection 整数变量设置为一个数字,当我滑动选项卡时,ListFragments显示正确的选定项目。这非常有效。
当我尝试更新代码上的列表(即使用新字符串更新ListFragment适配器)时,问题就出现了:我想根据保存在数据库中的值更新 currentSelection 。
这就是:
因此,在选项卡号2(距离4的2个选项卡)上,选择不会更新。此外,当我在选项卡4上并更新数据时,选项卡2的 setSelectedItem 方法将进入捕获的异常(“尚未创建内容”)。活动存在,但ListView似乎无法接受 setItemChecked 的选择。
编辑:当我从标签4移动到3(步骤7)时,调用 onViewCreated of tab 2 ,如果我调用 setSelectedItem ,则不会引发异常,但是选择也没有设置。
如果 getListView()失败,如何在所有三个标签上选择我想要的项目?
答案 0 :(得分:0)
另外,当我在tab 4上并更新数据时,setSelectedItem 选项卡2的方法进入了捕获的异常(“内容不是 然而创造了“)。
这种情况正在发生,因为你离可见页面太远,这意味着片段的视图被破坏(出于效率目的)。
如何在所有三个选项卡上选择我想要的项目 getListView()失败了吗?
在ListFragment的onResume()回调中移动setSelectedItem()方法。现在,您确实进行了正确的设置以恢复所选项目,但是,当片段的视图被销毁并自动恢复时(使用之前的选择),当系统还原发生时,您将最终得到旧值在中调用onActivityCreated()之后。 onResume()是在片段完全可用之前执行的最后一个回调,因此您将确保最后一次恢复currentSelection。