天天看点

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 <code>over_scroll_always</code> (default),<code>over_scroll_if_content_scrolls</code> (allow

over-scrolling only if the view content is larger than the container), or<code>over_scroll_never</code>.

setting the over-scroll mode of a view will have an effect only if the view is capable of scrolling.

overrides: setoverscrollmode(...) inview

<dl>

<dt>parameters:</dt>

<dd>

mode the new over-scroll mode for this view.</dd>

</dl>

abslistview.java

[java] view

plaincopy

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

@override  

public void setoverscrollmode(int mode) {  

    if (mode != over_scroll_never) {  

        if (medgeglowtop == null) {  

            context context = getcontext();  

            medgeglowtop = new edgeeffect(context);  

            medgeglowbottom = new edgeeffect(context);  

        }  

    } else {  

        medgeglowtop = null;  

        medgeglowbottom = null;  

    }  

    super.setoverscrollmode(mode);  

}  

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

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

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

不过进一步翻看api源码 我发现只要把medgeglowtop 和medgeglowbottom的medge和mglow设为透明就行了代码如下

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

class&lt;?&gt; c = (class&lt;?&gt;) class.forname(abslistview.class.getname());  

            field egtfield = c.getdeclaredfield("medgeglowtop");  

            field egbbottom = c.getdeclaredfield("medgeglowbottom");  

            egtfield.setaccessible(true);  

            egbbottom.setaccessible(true);  

            object egtobject = egtfield.get(this); //this 指的是listivew实例  

            object egbobject = egbbottom.get(this);  

            //egtobject.getclass() 实际上是一个 edgeeffect 其中有两个重要属性  mglow medge 并且这两个属性都是drawable类型  

            class&lt;?&gt; cc = (class&lt;?&gt;) class.forname(egtobject.getclass().getname());  

            field mglow = cc.getdeclaredfield("mglow");  

            mglow.setaccessible(true);  

            mglow.set(egtobject,new colordrawable(color.transparent));  

            mglow.set(egbobject,new colordrawable(color.transparent));  

            field medge = cc.getdeclaredfield("medge");  

            medge.setaccessible(true);  

            medge.set(egtobject,new colordrawable(color.transparent));  

            medge.set(egbobject,new colordrawable(color.transparent));  

注:

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

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

继续阅读