ListFragments的FragmentPagerAdapter:如何加载ListView选择?

时间:2014-07-26 17:45:04

标签: android android-listview android-listfragment fragmentpageradapter

我的个人Android应用程序出现问题,让我发疯。

我的活动包含 PagerSlidingTabStrip ,该活动由 FragmentPagerAdapter 4个固定标签组成,如下图所示。

enter image description here

第一个选项卡是一种摘要,它报告在以下选项卡上完成的选择项目(图像中的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

这就是:

  1. 我从数据库中加载了一个“2-3-5”选项,并将三个ListFragment选项卡的 currentSelection 字段分配给这些值。
  2. 如果我滑动到标签2并选择了项目编号“2”(参见图像,正确!
  3. 在标签3上,选择了项目编号“3”(正确!
  4. 在标签4上,选择了项目编号“5”(正确!
  5. 我从数据库中加载了一组新项目和一组“1-2-3”;然后我再次分配三个ListFragment标签的字段 currentSelection
  6. 在标签4上,选项会刷新,现在为“3”(正确!
  7. 我滑动到标签3并选择了项目编号“2”(正确!
  8. 我滑动到标签2并选择了项目编号“2”(错误,因为它是旧值!
  9. 因此,在选项卡号2(距离4的2个选项卡)上,选择不会更新。此外,当我在选项卡4上并更新数据时,选项卡2的 setSelectedItem 方法将进入捕获的异常(“尚未创建内容”)。活动存在,但ListView似乎无法接受 setItemChecked 的选择。

    编辑:当我从标签4移动到3(步骤7)时,调用 onViewCreated of tab 2 ,如果我调用 setSelectedItem ,则不会引发异常,但是选择也没有设置。

    如果 getListView()失败,如何在所有三个标签上选择我想要的项目?

1 个答案:

答案 0 :(得分:0)

  

另外,当我在tab 4上并更新数据时,setSelectedItem   选项卡2的方法进入了捕获的异常(“内容不是   然而创造了“)。

这种情况正在发生,因为你离可见页面太远,这意味着片段的视图被破坏(出于效率目的)。

  

如何在所有三个选项卡上选择我想要的项目   getListView()失败了吗?

在ListFragment的onResume()回调中移动setSelectedItem()方法。现在,您确实进行了正确的设置以恢复所选项目,但是,当片段的视图被销毁并自动恢复时(使用之前的选择),当系统还原发生时,您将最终得到旧值中调用onActivityCreated()之后。 onResume()是在片段完全可用之前执行的最后一个回调,因此您将确保最后一次恢复currentSelection。