1.GridView之类的Adapter的getView方法在position处于0的位置上存在“伪调用”,即getView中return的View不一定被用于绘图,而是只是用于控件测量尺寸用。问题来了,之前有一次做异步调用前把View存在一个HashMap中,数据返回后通过HashMap获取View。其他都正常,唯独第一项不能正常刷新界面。
解决办法:在网上有种方法,说通过parent的child数目与position比较,如果不相等,就是伪调用,呵呵了,翻回首页时,position为0,child不为0。还有其他方法,都很委婉,还是偶尔会有疏漏。自己的方法:在converView为空即需要new View的时候,把View直接add放到List里面保存,而之前说的HashMap的Key保存到View的Tag,当异步调用返回时,直接遍历,根据Tag查找所需的View,缺点,效率不高,不过一屏没有几个item,可以忍,最起码不出错。
2.GridView的边界问题,默认情况GridView即使设置了padding为0,还是有一点边界。
其实是GridView的listSelector中设置了九宫格图片导致的,如果想去掉边界,可以把它设成透明
android:listSelector="@android:color/transparent"
但是如此你会发现,原本滚动条不会在item上,现在会了。
3.GridView里层的视图最好是match_parent,有时会影响性能。
4.getColumnWidth方法在低版本不存在,为了兼容性,从GridView派生并覆盖该方法
public class CustomGridView extends GridView { public CustomGridView(Context context){ super(context); } public CustomGridView(Context context, AttributeSet attrs){ super(context, attrs); } public CustomGridView(Context context, AttributeSet attrs, int defStyle){ super(context, attrs, defStyle); } @SuppressLint("NewApi") @Override public int getColumnWidth(){ if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) return super.getColumnWidth(); else{ try{ Field field = GridView.class.getDeclaredField("mColumnWidth"); field.setAccessible(true); Integer value = (Integer) field.get(this); field.setAccessible(false); return value.intValue(); }catch(NoSuchFieldException e){ throw new RuntimeException(e); }catch(IllegalAccessException e){ throw new RuntimeException(e); } } } }