ListView和GridView 自定义Adapter的getView()方法调用问题

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>


你可能感兴趣的:(ListView,GridView,getView)