Android中的Adapter内的getView方法. 常常在调用次数上有一些问题。
1.getView多次调用
问题描述:getView方法被多次调用。这是android机制中要计算高的时候出现的一些多次调用
解决办法①
直接将该listview的父控件布局改为fill_parent就ok了
解决办法②
有时上面的解决办法不起作用,比如在dialog离加载listView的时候。所以需要加一些判断
<span style="font-size:14px;">if(parent.<span style="font-family: Arial, Helvetica, sans-serif;">getChildCount</span>() == position) { 正常情况下应该执行的代码 } else { 这里就是多次加载的问题,可以不用理这里面的 代码, } </span>
自定义一个GridView 在onMeasure 和onLayout里修改isOnMeasure的值
public class MyGridView extends GridView { public boolean isOnMeasure; 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) { Log.d("onMeasure", "onMeasure"); isOnMeasure = true; super.onMeasure(widthMeasureSpec, heightMeasureSpec); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { Log.d("onLayout", "onLayout"); isOnMeasure = false; super.onLayout(changed, l, t, r, b); } }
2.然后利用log去观察运行结果,发现重复调用的getView会关联onMeasure方法一起调用,而正常调用的getView关联onLayout方法一起调用。
3然后在getView中利用这个变量判断当前是否是onMeasure。
public View getView(int position, View convertView, ViewGroup parent) { ... //判断父控件的对象是不是你要展现的view对象 if(parent instanceof MyGridView){ if(((MyGridView) parent).isMeasure()){ return convertView; } } ...}
2.调用getView时,position=0多次出现
问题描述:
假设你自己定义的某个ListView 或者GridView,有可能在程序运行中修改它们的Item的高度,那么此时getView将被回调.于是就出现position=0的情况. 因为出现这种情况,并且此时item内的对象的引用与正确的position=0是不一样的,它不过一个临时的对象而已. 所以,常常会使得我们的显示或者逻辑出现错误。
解决办法:
加个条件来判断此时是临时的position=0还是真正的position=0
<span style="font-size:14px;"> if (parent.getChildCount() == position) { //里面就是正常的position } else { //临时的position=0 }</span>