我在一个GridView中放了10行数据,由于屏幕大小的关系会产生滚动,我设置了点击GridView中的子项(子项是TextView),就改变这个TextView的字体颜色。
到这里都没有问题,假如我点击第一行中的某些数据(假如说是第一项和第三项),被点击的项字体颜色确实改变了,但是如果我往下滚动GridView,再回到上面的时候,奇异的事情发生了,原来点击过的项字体恢复到没点的情况,而不该变色的项字体变色了,而且这种现象还是随机的,请问有人碰到过这样的情况吗?或者有人知道怎么解决这个问题吗?
有答案马上结贴,在线等,谢谢了!

解决方案 »

  1.   

    没碰到过,我觉得与gridview里面的一些机制有关吧。
      

  2.   

    这个问题我知道的。出现这样问题的原因是GridView的缓存机制。此机制简要表述为滑动上去的item,被android重新利用,从下面帮你滑上来了。具体表现为如何取决于你的adapter的getView方法。要解决这个问题,需要重写getItemViewType,getViewTypeCount两个方法。如:@Override
    public int getItemViewType(int position) {
    return channels.get(position).isSection ? TYPE_SECTION : TYPE_CHANNEL;
    } @Override
    public int getViewTypeCount() {
    return VIEW_TYPE_COUNT;
    }这样做的目的是告诉GridView你有两种ViewType,方便GridView缓存的时候区分这两种。
      

  3.   

    return channels.get(position).isSection ? TYPE_SECTION : TYPE_CHANNEL;
    这里面的channels, TYPE_SECTION 和 TYPE_CHANNEL分别是什么呀?
    谢谢了!
      

  4.   

    这个问题就是在getView重画造成的。
      GridView加载一个list的时候,假设这个List有100项,但每个屏幕只能显示12项,当GridView加载一个适配器的时候,适配器在getView加载要显示的Viwe,虽然List有100项,但显示的区域只有12项,所以GridViwe不管绑定多少数据 但它有的View项只有12项,当你滑动屏幕的时候,只是把这12个已有的View的数据更改了而已,所以当你滑动窗口前更改的数据没有改变到list中时,当再次滑回原处就会出现颜色不愿成原来的样子。而LZ所说的偶有偶无 应该就是缓存的问题在在
      

  5.   

      这个问题就是在getView重画造成的。
      GridView加载一个list的时候,假设这个List有100项,但每个屏幕只能显示12项,当GridView加载一个适配器的时候,适配器在 getView加载要显示的Viwe,虽然List有100项,但显示的区域只有12项,所以GridViwe不管绑定多少数据 但它有的View项只有12项,当你滑动屏幕的时候,只是把这12个已有的View的数据更改了而已,所以当你滑动窗口前更改的数据没有改变到list中时,当再次滑回原处就会出现颜色不愿成原来的样子。而LZ所说的偶有偶无 应该就是缓存的问题在在 两位回答的已经够好的了。。
      

  6.   

    我就是想问下四楼的回答中,channels.get(position).isSection ? TYPE_SECTION : TYPE_CHANNEL;
    这里面的channels, TYPE_SECTION 和 TYPE_CHANNEL分别是什么?
    能给个全的代码吗。
    谢谢了!
      

  7.   

    自己顶一下,四楼说要解决这个问题,需要重写getItemViewType,getViewTypeCount两个方法。如:@Override
    public int getItemViewType(int position) {
    return channels.get(position).isSection ? TYPE_SECTION : TYPE_CHANNEL;
    }@Override
    public int getViewTypeCount() {
    return VIEW_TYPE_COUNT;
    }
    这里面channels.get(position).isSection ? TYPE_SECTION : TYPE_CHANNEL;
    这里面的channels, TYPE_SECTION 和 TYPE_CHANNEL分别是什么?
    还有哪位好心人能给个全的代码吗。
    谢谢了!
    困惑了好久了