u014717505
aaaffaewrerewrwer
采纳率0%
2018-06-30 08:29 阅读 616

一个关于listview的神奇的现象,百思不得其解

5

我有几个Fragment,其中一个Fragment里面有一个listview。这个Fragment里面的onCreateView里面对listview进行布局,就是说listview每次onCreateView被执行的时候都重新New一次,listview的Adapter也在onCreateView每次都重新New一次。
我把listview的ITEM滚动到某个位置(比如是第五条ITEM处于listview的最上面),然后在其他Fragment来回切换,大家都知道,这种时候,listview所在的Fragment里面的onCreateView是要被执行的,也就是说,我的listview被重新布局,然后,Adapter也重新New了。那么按理说,这时我再回到listview所在的Fragment的时候,此时的listview已经不可能再处于以前滚动后的ITEM的位置了吧(因为listview已经是重新New过的了)。
但神奇的是,居然listview还是完好的停留在以前滚动后的ITEM的位置(第五条ITEM处于listview的最上面)。
太神奇了,listview已经被New过了啊,它已经不是以前的listviwew了啊,此时,应该是第一条ITEM处于listview的最上面啊!为什么还是第五条ITEM处于listview的最上面啊?
难道Fragment有记忆listview状态的神奇功能???实在想不清楚了。。。。。请诸位老师指教!

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

5条回答 默认 最新

  • u014717505 aaaffaewrerewrwer 2018-06-30 12:31

    想了一下午,有点明白了,暂且汇报一下。
    listview和Adapter无疑是New过了,跟踪了多次,这点确认无疑。就是说listview和它所用的数据都已经是新的了,和以前已经无关了。
    那么为什么能保持以前的位置(第五条ITEM处于listview的最上面)不变呢。应该是Adapter的父类BaseAdapter(或者是BaseAdapter的父类)里有个position的静态成员,
    所以,这个静态成员变量记忆住了以前的位置。Adapter再次New的时候,这个静态成员变量里还是保存着以前的位置(第五条ITEM处于listview的最上面)。
    应该是这个原因。java和安卓环境都不太熟,不太会进一步跟踪到封装好的父类里面了。但根据分析,只可能是这个原因了。
    如有不对,请指教。

    点赞 1 评论 复制链接分享
  • littlejade1214 毛线一团 2018-06-30 08:57

    能不能展开说说什么叫在其他Fragment来回切换

    点赞 评论 复制链接分享
  • u014717505 aaaffaewrerewrwer 2018-06-30 09:10

    littlejade1214 老师,比如说我共有3个Fragment(就是在一个tablayout共有3个选项卡,每个选项卡对应1个Fragment),listview所在Fragment是第1个,另外还有另外2个Fragment.
    我在第1个Fragment里,把listview的状态滚动为第五条ITEM处于listview的最上面。然后在来回点击另外tablayout的另外两个选项卡(也就是相当于在另外2个Fragment之间来回切换。这时侯第1个Fragment里的onCreateView是要被执行的,于是listview也被重新New)。
    我百思不得其解的就是被重新New过的listview为什么还能完好的保持New以前的状态(第五条ITEM处于listview的最上面)。
    有类似程序的老师们可以看一下,不管Fragment怎么切换,listview总是保持切换前的状态

    点赞 评论 复制链接分享
  • u014717505 aaaffaewrerewrwer 2018-06-30 09:15

    有点错别字:是然后再来回点击tablayout的另外两个选项卡

    点赞 评论 复制链接分享
  • wj7788387 Jay Ng 2018-08-24 06:14

    请问你是配合ViewPager来做的吗,如果ViewPager用的FragmentPagerAdapter适配器,在来回切换时根本就不会销毁Fragment,
    也就不会重新创建Fragment,那么你的ListView和它的适配器都不会重新创建。

    点赞 评论 复制链接分享

相关推荐