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的刷新机制并不相关。

posted @ 2015-07-01 16:47  钢面公爵  阅读(877)  评论(0编辑  收藏  举报