ListView 使用overscroll的情况下 消除mEdgeGlowTop 和 mEdgeGlowBottom

转载请注明出处http://blog.csdn.net/pkxiuluo01/article/details/17415427


首先给个链接:如何2.3之后如何添加listview 的overscroll(边界回弹)效果,http://blog.csdn.net/androiddevelop/article/details/8155350


正文:


android  2.3 ListView引入   overscroll 的相关api 之后  添加了一个自带的效果 也就是 当滑动到边界的时候,如果再滑动,就会有一个边界就会有一个发光效果

如何去掉这个效果呢?以下有两种情况需要考虑

一.如果不需要使用 overscroll的那种 回弹效果 

解决方案:

只需要在布局的 xml中  添加android:fadingEdge="none" 或者在代码中添加setOverScrollMode(OVER_SCROLL_NEVER);

OVER_SCROLL_NEVER的含义是 在任何情况下都不可以overscroll

void android.widget. AbsListView.setOverScrollMode( int mode)

Set the over-scroll mode for this view. Valid over-scroll modes are OVER_SCROLL_ALWAYS (default),OVER_SCROLL_IF_CONTENT_SCROLLS (allow over-scrolling only if the view content is larger than the container), orOVER_SCROLL_NEVER. Setting the over-scroll mode of a view will have an effect only if the view is capable of scrolling.

Overrides:  setOverScrollMode(...) in View
Parameters:
mode The new over-scroll mode for this view.


AbsListView.java

[java]  view plain copy
  1. @Override  
  2. public void setOverScrollMode(int mode) {  
  3.     if (mode != OVER_SCROLL_NEVER) {  
  4.         if (mEdgeGlowTop == null) {  
  5.             Context context = getContext();  
  6.             mEdgeGlowTop = new EdgeEffect(context);  
  7.             mEdgeGlowBottom = new EdgeEffect(context);  
  8.         }  
  9.     } else {  
  10.         mEdgeGlowTop = null;  
  11.         mEdgeGlowBottom = null;  
  12.     }  
  13.     super.setOverScrollMode(mode);  
  14. }  


二.需要使用api提供的 overscroll效果

解决方案:由于需要使用overscroll效果就不能简单的通过设置 scrollMode了 这个时候需要用java 的反射来解决

通过网上搜索的解决方案是 把mEdgeGlowTop 和mEdgeGlowBottom设为null 但是通过运行后发现有会抛出NullPoiontException (测试的系统版本为4.1.1手机为小米2)

不过进一步翻看api源码 我发现只要把mEdgeGlowTop 和mEdgeGlowBottom的mEdge和mGlow设为透明就行了代码如下


[java]  view plain copy
  1. Class<?> c = (Class<?>) Class.forName(AbsListView.class.getName());  
  2.             Field egtField = c.getDeclaredField("mEdgeGlowTop");  
  3.             Field egbBottom = c.getDeclaredField("mEdgeGlowBottom");  
  4.             egtField.setAccessible(true);  
  5.             egbBottom.setAccessible(true);  
  6.             Object egtObject = egtField.get(this); //this 指的是ListiVew实例  
  7.             Object egbObject = egbBottom.get(this);  
  8.               
  9.             //egtObject.getClass() 实际上是一个 EdgeEffect 其中有两个重要属性  mGlow mEdge 并且这两个属性都是Drawable类型  
  10.             Class<?> cc = (Class<?>) Class.forName(egtObject.getClass().getName());  
  11.             Field mGlow = cc.getDeclaredField("mGlow");  
  12.             mGlow.setAccessible(true);  
  13.             mGlow.set(egtObject,new ColorDrawable(Color.TRANSPARENT));  
  14.             mGlow.set(egbObject,new ColorDrawable(Color.TRANSPARENT));  
  15.               
  16.             Field mEdge = cc.getDeclaredField("mEdge");  
  17.             mEdge.setAccessible(true);  
  18.             mEdge.set(egtObject,new ColorDrawable(Color.TRANSPARENT));  
  19.             mEdge.set(egbObject,new ColorDrawable(Color.TRANSPARENT));  


注:
1.别忘了try catch 可能抛出的异常

2.为了在低版本不出bug 最好加个版本判断 大于api level 9的 可以使用该方法

你可能感兴趣的:(ListView 使用overscroll的情况下 消除mEdgeGlowTop 和 mEdgeGlowBottom)