zoukankan      html  css  js  c++  java
  • convertView、viewholder requestlayout与adapter的刷新机制

    convertView和viewholder作为adapter中复用数据的标配,应用范围很广,但是需要注意,在一些地方,需要相对复杂地动态刷新操作,converview要复用起来就给自己找难受了。

    例如说最近做项目的一个复选节点的问题,当一个父节点下面的子节点被选中,这时会把他的converview设置background,紧接着如果点击父节点收缩该节点(即适配该adapter的数据减少),那么问题出现了,由于convertview是按照position来get的,并且可以复用,那么原来子节点的位置上,依然会有背景色,但是这时候这个位置上已经是别的节点了,解决办法就是不用convertView...

    .

     第二个问题,我们知道requestlayout()调用以后组件会要求刷新自己,对于listview这会不会重新调用adapter的getview()方法呢?

     public class NodeTree extends LinearLaoyout{   
    public void setPosition(int x,int y){ //this.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);调用这个方法要刷新adapter,就要addview,就要多parent int width = this.getWidth();//奇怪,这里怎么就能get到了? int height = this.getHeight(); this.layout(x, y, x+width, y+height); //this.requestLayout(); }
    }

    再者,看上图这个nodetree类,当我调用nodetree.setPosition(100,100),如果不调用request,则界面会移动,如果调用,则界面肯定是又进行了一次刷新,结果是界面没有发生位移。

    网上查了下,对于requestlayout的解释比较好的是:http://blog.csdn.net/djun100/article/details/11917777,view会依次向上传递request,经过的各个节点都要经过measure和layout的一系列判断和操作。

    所以,对于listview,并不会调用adapter的getview方法,也就是与adapter的刷新机制并不相关。

  • 相关阅读:
    学习Vue CLI 3.x版本的安装以及创建项目
    Java中同一线程中的对象hashcode一样
    Java中线程范围内共享问题
    Java中的线程池模拟
    java中的Switch
    string、stringbuffer、stringbuild的时间性能对比
    Java中lock上锁 unlock解锁
    java中的三目运算
    Java中的Instanceof
    一个简单的for循环
  • 原文地址:https://www.cnblogs.com/gangmiangongjue/p/4582149.html
Copyright © 2011-2022 走看看