`
iamzhaozheng
  • 浏览: 160373 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

解决Android下ViewPager和PagerAdapter中调用notifyDataSetChanged失效问题

阅读更多

Google在Android 3.0SDK中推出的ViewPager控件很大程度上满足了开发者开发页面左右移动切换的功能,使用非常方便,参见:http://jameszhao84.iteye.com/blog/1344584。但是使用中发现,在删除或者修改数据的时候,PagerAdapter无法像BaseAdapter那样仅通过notifyDataSetChanged方法通知刷新View。


最基本的方法:

针对于child view比较简单的情况(例如仅有TextView、ImageView等,没有ListView等展示数据的情况),可以在自己的Adapter中加入代码:

 

	@Override
	public int getItemPosition(Object object) {
		return POSITION_NONE;
	}
 

这样既可达到一般情况下要求的效果。


存在的问题:

这不是PagerAdapter中的Bug,通常情况下,调用notifyDataSetChanged方法会让ViewPager通过Adapter的getItemPosition方法查询一遍所有child view,这种情况下,所有child view位置均为POSITION_NONE,表示所有的child view都不存在,ViewPager会调用destroyItem方法销毁,并且重新生成,加大系统开销,并在一些复杂情况下导致逻辑问题。特别是对于只是希望更新child view内容的时候,造成了完全不必要的开销。


更有效地方法:

更为靠谱的方法是因地制宜,根据自己的需求来实现notifyDataSetChanged的功能,比如,在仅需要对某个View内容进行更新时,在instantiateItem()时,用View.setTag方法加入标志,在需要更新信息时,通过findViewWithTag的方法找到对应的View进行更新即可。

0
0
分享到:
评论
3 楼 liujunhg 2012-05-25  
明白了,是这里的问题,之前我一直都是用position来实现这个移除方法的,谢谢了
2 楼 iamzhaozheng 2012-05-25  
liujunhg 写道
我最近也在弄这个,可是发现个问题,viewpager中添加的view视图,是无法删除,就算destroyItem,那也只是一个把那个页面清空了,但是还会占一个位置,不知你有没研究过?

	@Override
	public void destroyItem(ViewGroup container, int position, Object object) {
		container.removeView((View)object);
	}
是可以的
1 楼 liujunhg 2012-05-24  
我最近也在弄这个,可是发现个问题,viewpager中添加的view视图,是无法删除,就算destroyItem,那也只是一个把那个页面清空了,但是还会占一个位置,不知你有没研究过?

相关推荐

    viewpager + PagerAdapter刷新数据

    在Android开发中,ViewPager是一个非常常用的组件,它用于展示可滑动的页面集合。结合PagerAdapter,我们可以实现一个动态加载和刷新数据的视图系统。在本文中,我们将深入探讨如何利用ViewPager和PagerAdapter来...

    ViewPager使用中notifyDataSetChanged无法更新问题解决

    然而,在实际使用过程中,我们可能会遇到一个常见问题:当数据集发生变化时,调用`PagerAdapter.notifyDataSetChanged()`方法,但ViewPager并没有自动更新显示的内容。这个问题困扰了很多开发者,本文将深入探讨这个...

    ViewPager中使用FragmentPagerAdapter.notifyDataSetChanged无法更新当前Fragment解决方案

    然而,在实际操作中,开发者可能会遇到一个常见问题:当试图通过调用FragmentPagerAdapter的`notifyDataSetChanged()`方法来更新ViewPager中的Fragment时,发现页面并没有如预期那样更新。这个问题主要涉及到Android...

    FragmentPagerAdapter调用notifyDataSetChanged无效及解决方案

    在Android开发中,`FragmentPagerAdapter`是用于管理`ViewPager`中的`Fragment`序列的一个关键组件。然而,有时候开发者可能会遇到一个问题:当尝试调用`FragmentPagerAdapter`的`notifyDataSetChanged()`方法来更新...

    Android 中解决Viewpage调用notifyDataSetChanged()时界面无刷新的问题

    然而,当你尝试更新`ViewPager`中的数据集并调用`notifyDataSetChanged()`时,有时会遇到界面无刷新的问题,即界面没有根据新的数据进行更新。这通常会给开发者带来困扰,因为数据已更改,但用户界面并未反映出这些...

    详解Android App中ViewPager使用PagerAdapter的方法

    当调用`notifyDataSetChanged()`时,ViewPager没有响应,这可能是因为默认情况下,PagerAdapter并不支持动态数据更新。为了解决这个问题,你可以创建一个自定义的PagerAdapter,并覆写`instantiateItem()`和`...

    Android listview和viewpager解决冲突 滑动冲突

    Android listview viewpager 滑动 跳动 冲突解决 ListView中嵌套ViewPage有或者滑动手势冲突解决 blog 地址 : http://blog.csdn.net/aaawqqq/article/details/43824631

    android ViewPager 和 listview的共存问题

    解决这个问题的方法是自定义ViewPager,重写onInterceptTouchEvent和onTouchEvent方法,限制ViewPager在特定条件下接收触摸事件,比如只在滑动边缘时响应滑动。 2. 页面滑动时ListView的可见性:当ViewPager页面...

    android的ViewPager和Animation的一些使用

    在Android开发中,`ViewPager`和`Animation`是两个非常重要的组件,它们分别用于实现页面滑动效果和动画效果。这篇博客"android的ViewPager和Animation的一些使用"详细介绍了如何在应用中有效地结合这两个组件,以...

    viewpager 关于子页面控件监听的解决方法

    在Android开发中,ViewPager是一个非常常用的组件,它用于展示多个Fragment或者View,并且可以左右滑动切换页面。在实际应用中,我们常常需要对ViewPager的子页面中的控件进行监听,以便实现各种交互功能。本篇文章...

    android中ViewPager简单实例

    这个实例涉及到的知识点包括:Android的ViewPager组件、Fragment管理和PagerAdapter的使用,以及如何在Java代码中设置和初始化这些组件。这些都是Android开发中的基础技能,对于构建具有多个页面滑动切换功能的应用...

    Android实现ViewPager+Fragment左右滑动

    在Android开发中,`ViewPager`和`Fragment`的结合使用是一种常见的实现屏幕间左右滑动切换的机制。这种设计模式可以提供高效的用户体验,使得用户在多个内容之间进行平滑的过渡,常见于应用的引导页、TabLayout或者...

    Android - ViewPager滑动广告栏源码

    在Android开发中,ViewPager是一个非常重要的组件,常用于实现页面滑动效果,比如常见的应用启动页、图片轮播、广告栏等。本源码提供的就是一个使用ViewPager实现的滑动广告栏,具有自动切换和自动适配功能,可以...

    Android中ViewPager获取当前显示的Fragment

    下面就给大家介绍下Android中ViewPager获取当前显示的Fragment的方法,一起看看吧。 一、使用 getSupportFragmentManager().findFragmentByTag()方法 Viewpager + FragmentPagerAdapter 情况下 才好使; ...

    android viewpager各种滑动动画

    在Android开发中,ViewPager是一个非常重要的组件,常用于实现页面滑动切换的效果,例如在应用的引导页、图片轮播或者Tab布局中。本篇将深入讲解如何在ViewPager中实现各种自定义滑动动画,以及如何优化性能并保持...

    Android Viewpager中删除

    当我们想要删除一个页面时,实际上是需要更新Adapter中的数据集并调用其`notifyDataSetChanged()`方法来通知ViewPager数据已改变。 1. **创建自定义PagerAdapter**:通常,我们会继承`PagerAdapter`或`...

    Android顶部导航之TabLayout和ViewPager的组合

    `TabLayout`和`ViewPager`是Android Support Library中的组件,它们提供了强大的功能和灵活性,使得在Android应用中实现滑动页面和标签切换变得简单。 首先,`TabLayout`是一个用于展示可选标签的视图,通常与`...

Global site tag (gtag.js) - Google Analytics