天天看點

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的 可以使用該方法

繼續閱讀