无法实现notifyDataSetChanged()

时间:2014-05-04 13:48:43

标签: android android-fragments notifydatasetchanged fragmentstatepageradapter

我使用FragmentStatePagerAdapter来实现VerticalPageAdapter目的,我必须创建一个与Button按下相同的片段的动态数字,所以,我只检索getItem()方法中的指定片段:

public Fragment getItem(int i) {            
  return new Center_ver();        
}

并且getCount()会返回与其他片段中已按下的Button相关的动态数字:

@Override
public int getCount() {         
    return num_of_gangs;    
}

但是这给了我IlligalStateException,因为我没有被称为notifyDataSetChanged(),所以,我将通知添加到我用来提高碎片数量的方法中:< / p>

public void add_gang() {    
    num_of_gangs ++;
    notifyDataSetChanged();     
}

但我也得到了IlligalStateException

05-04 13:43:43.210: E/AndroidRuntime(1625): FATAL EXCEPTION: main
05-04 13:43:43.210: E/AndroidRuntime(1625): java.lang.IllegalStateException: The application's PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged! Expected adapter item count: 1, found: 5 Pager id: com.automation.isolace:id/lighting_vertical_pager Pager class: class com.automation.standards.VerticalViewPager Problematic adapter: class com.automation.pageadapters.LightVerticalPageAdapter

所以,我决定在返回Value之前在getCount()方法中添加它,如下所示:

@Override
public int getCount() {     
    notifyDataSetChanged();
    return num_of_gangs ;    
}

但这给了我一个StackOverflowError

05-04 13:46:36.326: E/AndroidRuntime(1690): FATAL EXCEPTION: main
05-04 13:46:36.326: E/AndroidRuntime(1690): java.lang.StackOverflowError
05-04 13:46:36.326: E/AndroidRuntime(1690):     at com.automation.standards.VerticalViewPager$PagerObserver.onChanged(VerticalViewPager.java:2717)
05-04 13:46:36.326: E/AndroidRuntime(1690):     at android.database.DataSetObservable.notifyChanged(DataSetObservable.java:37)
05-04 13:46:36.326: E/AndroidRuntime(1690):     at android.support.v4.view.PagerAdapter.notifyDataSetChanged(PagerAdapter.java:276)

2 个答案:

答案 0 :(得分:1)

您不应将notifyDataSetChanged()放入getCount()notifyDataSetChanged()调用getCount(),它以一个调用另一个的无限循环结束,称为StackOverflow错误。将数据添加到可能结果列表时,应该调用此方法。例如,如果要添加可能存储在ArrayList中的新片段,则可以执行以下操作:

public void add_gang(Fragment frag) {
    fragmentList.add(frag);
    notifyDataSetChanged();
}

答案 1 :(得分:0)

当填充元素的视图感觉它被欺骗时,这基本上会发生。检查是不是以经常性的方式进行,这就是为什么你偶尔会得到例外的原因。这是一种观点告诉我们,我们通知适配器的方式有问题,这是我们错过或不想要的东西。

当使用我们的适配器使用的列表的引用来填充视图时,通常会出现此设计故障。这样,在适配器和视图所在的同一活动中托管对象列表总是一个很好的简化,并通过add / addAll / remove / removeAll更新它。不要忘记在任何这些之后调用notifyDataSetChanged。