当ListView中item包含EditText,切换Fragment后数据丢失的解决方法

本文记录了在使用TabLayout与ViewPager结合的Fragment切换中遇到的数据丢失问题。问题在于切换时Fragment被销毁并重新创建,解决方案是重写FragmentPagerAdapter的destroyItem方法或设置setOffscreenPageLimit以保留Fragment状态。这种方法适用于少量Fragment的情况,防止数据丢失。
摘要由CSDN通过智能技术生成

1、首先,我这里的Fragment切换使用的是TabLayout与ViewPage结合的方式,当然也可以采用另一种使用FrameLayout作为子布局,然后根据要求调用replace方法,或者hide和show方法结合,这里只讲述TabLayout与ViewPage结合的方式,作为记录。

2、当时的情景大致是:在ListView(此ListView处于第三个Fragment)的某个item中的EditText输入信息后,切换到第一个Fragment后,再次切回来,发现数据全没了,如果是从第三个Fragment切换到第二个Fragment再切回来,数据还在。之前考虑过是不是要调用setText数据才不会消失,但是当时项目中给EditText设置了addTextChangeListener,调用setText又会触发该方法,然后又按照网上的方法弄了一下,还是不行。

3、最后,发现是切换时,Fragment会被销毁然后再重新创建,这跟使用TabLayout与ViewPage结合的方式有关,使用viewpage切换时,会在加载当前fragment的同时预加载下一个fragment,当切换到第三个fragment时又会将第一个fragment销毁,再次切换到第一个fragment会重新创建该fragment,预加载第二个fragment,第三个fragment则会被销毁,切换到第二个fragment或第三个fragment时,第三个fragment都会被重新创建,问题就出现在这里。

4、上述已经确定了问题就是fragment被销毁后重新创建,想要解决该问题也很简单,就是在切换时不让它销毁fragment(fragment少时可以采用,fragment太多不销毁会占用内存,此处只讨论fragment少的情况),只需在继承FragmentPagerAdapter时重写destroyItem,注释掉调用父类方法即可。
在这里插入图片描述
5、或者通过调用setOffscreenPageLimit()方法,从而设置ViewPager预加载的fragment数量。此处因为我是在三个fragment之间切换,所以设置值为2,通过调用setOffscreenPageLimit(2)后,我这里三个fragment会一次全部加载完成,切换过程中不会再次加载。
在这里插入图片描述
6、本篇文章只用于记录自己在学习中遇到的问题及解决方法,适用范围小,其他情况下不一定适用,仅做参考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值