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,否则会出现空指针异常,因为源码里认为它们不为空,进行了一些操作。

posted @ 2014-04-22 14:12  神一样的神经病  阅读(601)  评论(0编辑  收藏  举报