今天在写一个GridView的BaseAdapter时发现,Adapter的getview方法在position为0的时候会连续调用好几次。
我们知道谷歌时是做过优化的,让view有个缓存,我怀疑是因为做缓存的原因才让position连续调用
log如图
可见position为0调用了好几次getview,但其它的又没有重复调用。
然而我恰好要动态改变第一个view,所以我写了
if(position == 0){
ac = viewholder.textview;
}
将position为0的textview缓存下来了。
当我在fragment修改这个textview的值为C,setText确实奏效了,它的值变成了C。但当我再次将其改变为AC时,他却没有了变化,还是C。
我又打了这个textview内容的log,log显示的是AC。
这就很奇怪了,分明屏幕上写的是C但是现在是AC。所以我不是单纯的将position为0的TextView缓存,而是只缓存了第一次调用getview的TextView。
然后重复修改它的值,这次成功了。它可以动态修改了。
这是因为position为0的有好几份。而adapter的getview方法会因为界面的修改重新调用,如果凡是position就缓存,会导致每次修改的都不是同一份。
但是除了position为0的,其它都可以随便存(不包括滑动)。
总之,关于adaptr 因为谷歌的重复利用convertview,我们不能为所欲为的操作。很有可能不是同一个view。还是老老实实用notifyDataSetChanged();好点
如果将app置于后台,再次打开时。用TextView的settext方法修改的视图会变成最初始的
作者:qq_42429889