在实际开发中,我们经常会重写listview或者gridview并且重新测量他们的高度。如:
public class MyGridView extends GridView {
public MyGridView(Context context) {
super(context);
}
public MyGridView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyGridView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}
然后在代码中设置wrap_content布局。但是在添加适配器的时候因为高度设置的是最大高度,getView()会调用可见屏幕范围的次数。Android中的Adapter内,有getView方法. 假设你自己定义的某个ListView 或者GridView,有可能在程序运行中修改它们的Item的高度,那么此时getView将被回调.于是就出现position=0的情况. 因为出现这种情况,并且此时item内的对象的引用与正确的position=0是不一样的,它不过一个临时的对象而已. 所以,要加个条件来判断此时是否不是临时的position=0.
if (parent.getChildCount() == position) { //里面就是正常的position } else { //临时的position=0 }
这样添加判断就不会多次调用了。希望能帮到你。