【问题标题】:Can't achieve notifyDataSetChanged()无法实现 notifyDataSetChanged()
【发布时间】:2014-05-04 13:48:42
【问题描述】:

我正在使用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(),所以,我将通知添加到我用来提高片段数量的方法中:

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

所以,我决定在返回值之前将其添加到 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)

【问题讨论】:

  • 这是一堆乱七八糟的代码。查看整个 FragmentStatePagerAdapter 会有所帮助。

标签: android android-fragments notifydatasetchanged fragmentstatepageradapter


【解决方案1】:

您不应该将notifyDataSetChanged() 放入getCount()notifyDataSetChanged() 调用 getCount(),最终导致一个调用另一个的无限循环,称为 StackOverflow 错误。当您将数据添加到可能的结果列表中时,您应该调用它。例如,如果您要添加一个可能存储在 ArrayList 中的新 Fragment,您可以这样做:

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

【讨论】:

  • 好吧,我正在添加相同的片段布局所以我不必有片段列表,我总是返回相同的片段,这里的关键特征是返回的片段数这是通过getCount() 方法获得的,所以我只是在返回的片段编号的数量上加 1。所以正如我上面写的那样,我尝试在每次增加数字时调用notifyDataSetChanged(),但没有像我一样没有做任何改变。
  • +1 通知我 notifyDataSetChanged() 呼叫 getCount() ,我不知道。
【解决方案2】:

这基本上发生在填充元素的视图感觉它被欺骗时。检查不是以经常性方式进行的,这就是为什么您偶尔会遇到异常的原因。这是视图告诉我们通知适配器的方式有问题的一种方式,这是我们明显遗漏或不想要的。

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

【讨论】:

  • 没有办法添加/addAll/remove/removeAll,但我上面提到的方法将getCount()方法返回的数字加1
  • 如果您正在处理多个项目,使用元素列表来跟踪它们会更容易。您可以将/addAll/remove/removeAll 添加到该列表中,然后调用 notifyDataSetChanged()。
  • 这样您还可以简化 getCount() 和 add_gang 方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
相关资源
最近更新 更多