android去掉ListView顶部和底部的蓝色渐变效果
觉得这个东西不好看,就想把它去掉。网上查了一些资料,找到了源码中设置这种效果的地方:
AbsListView类中的两个成员变量:
private EdgeEffect mEdgeGlowTop; private EdgeEffect mEdgeGlowBottom;
然后再看看EdgeEffect类的源码:
EdgeEffect类中有两个成员变量:
private final Drawable mEdge; private final Drawable mGlow;
在创建EdgeEffect实例时,会加载系统资源R.drawable.overscroll_edge和R.drawable.overscroll_glow对其进行赋值。
想要去掉这种效果的话,只要通过反射,将这两个属性设置为空白的Drawable资源就行了。代码如下:
1 /** 2 * 去掉ListView顶部和底部的蓝色渐变 3 * 4 * @param absListView 5 */ 6 public static void cancelFadingEdge(AbsListView absListView) { 7 8 // 创建EdgeEffect实例,将mEdge和mGlow设置为空的Drawable 9 EdgeEffect edgeEffect = new EdgeEffect(absListView.getContext()); 10 Class<?> eeClz = edgeEffect.getClass(); 11 setField(eeClz, "mEdge", edgeEffect, new ColorDrawable()); 12 setField(eeClz, "mGlow", edgeEffect, new ColorDrawable()); 13 14 // 给ListView的mEdgeGlowTop和mEdgeGlowBottom赋值 15 try { 16 Class<?> lvClz = Class.forName("android.widget.AbsListView"); 17 setField(lvClz, "mEdgeGlowTop", absListView, edgeEffect); 18 setField(lvClz, "mEdgeGlowBottom", absListView, edgeEffect); 19 } catch (Exception e) { 20 e.printStackTrace(); 21 } 22 } 23 24 /** 25 * 通过反射的方式设置变量的值 26 * 27 * @param clz 28 * 属性所在类的Class 29 * @param fieldName 30 * 属性名 31 * @param obj 32 * 要赋值的对象 33 * @param value 34 * 值 35 */ 36 private static void setField(Class<?> clz, String fieldName, Object obj, 37 Object value) { 38 try { 39 Field field = clz.getDeclaredField(fieldName); 40 field.setAccessible(true); 41 field.set(obj, value); 42 } catch (Exception e) { 43 e.printStackTrace(); 44 } 45 }
注意:
mEdge.set(edgeEffect, new ColorDrawable()); mEdgeGlowTop.set(absListView, edgeEffect);
这两个地方不能将属性设置为null,否则会出现空指针异常,因为源码里认为它们不为空,进行了一些操作。