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(...) inView

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

时间: 2024-09-29 20:13:33

ListView 使用overscroll的情况下 消除mEdgeGlowTop 和 mEdgeGlowBottom的相关文章

listview间歇加载情况下性能的保持问题

问题描述 listview间歇加载情况下性能的保持问题 listview间歇加载情况下性能的保持问题,怎么让窗体间歇加载数据并排序的时候,保持listview不会出现卡顿和闪烁? 解决方案 异步排序,排好序再刷新列表 解决方案二: 可以用一个数组集合缓存数据,定时再把数据添加到listview上

java代码-在不增加太多代码的情况下,如何消除这个错误?

问题描述 在不增加太多代码的情况下,如何消除这个错误? import java.awt.Graphics; abstract class DrawTool { public abstract void paint(Graphics g); }class CircleTool extends DrawTool{ public void paint(Graphics g){ g.drawLine(1154); }}class RectTool extends DrawTool{ public voi

listview-ListView与DataTable绑定,选中一行的情况下,ListView不更新数据。

问题描述 ListView与DataTable绑定,选中一行的情况下,ListView不更新数据. 接触WPF不久,遇到一个看似简单,却无从下手的小问题.如图1所示,左边是个ListView,与DataTable绑定,根据右边的几个选项条件,列表显示不同的内容.在没有选择列表中的任何一行时,选择不同的条件(如报警等级),列表显示一切正常. 问题来了,如图1所示.假设,我选择了一个列表项(报警等级:高级),再选择条件"中级",列表竟然不更新内容,只是取消了选中的列表项(如图2),然后,必

easyui-session丢失的情况下报错TypeError:document.body is null

问题描述 session丢失的情况下报错TypeError:document.body is null web项目开发的时候,session丢失的时候,单击页面跳转时,会报错, 谷歌浏览器没问题 火狐浏览器弹出框TypeError:document.body is null,弹出框一闪而过 IE浏览器报错,弹出框一直存在不消失.点击确定后消失. 后台程序没有报错.初步判定是session丢失的时候出现的错误. 前台用的框架jquery和easyui 问题可以重新.比如启动服务器,登陆后,重启服务

adapter-目前情况下怎么设计代码比较优雅(android)?

问题描述 目前情况下怎么设计代码比较优雅(android)? 原来的项目里有好多listview,为此为每个listview都单独写了adapter和item,现在设计改设计了,要求每个listview都能和微信通讯录一样有sortbar和分类栏,那么我原来的做法是给每个item上面添加上一个隐藏的分类栏,然后再adapter中选择要不要显示,但是现在listview太多了,这样效率很低,我要怎么设计代码才能方便的达到这个需求? 解决方案 直接将 数据按照字母排序A_z,然后item分为两类 标

2、java代码在什么情况下有可能发生 &amp;amp;quot;过期引用&amp;amp;quot;

问题描述 第二贴什么情况下会发生"过期引用"造成垃圾无法收集,越多越好,可以在此讨论,谢绝灌水! 解决方案 解决方案二:堆栈先push然后再pop的时候,不会消除对象,他维护的依然是那个对象的引用.这个过期引用,以前碰到过的

在什么情况下“100-1=0”?

在什么情况下"100-1=0"? 这不是脑筋急转弯,不要告诉我"在算错的情况下等于零". 这是一个经典的产品质量的等式,源自日本经营之神松下幸之助所曾说过的一句名言:"对于产品质量来说,不是100分就是0分". 其含义在于,在100件产品中,如果有1件不合格,那么产品的质量并不会成为99,而是之前所有的努力都有可能化为泡影,即"100-1=0". 对于一些无伤大雅的消费品,我们通常都不会表现得太过苛刻,"差不多&qu

什么情况下会用EJB?

问题描述 可能是比较老的问题了.我目前的水平还理解,用过EJB的,能不能结合你的项目说说使用EJB后,和不用EJB相比,都带来了哪些好处?在网上查,很多说为了分布式,集群,问题又来了,什么情况下需要分布式呢?Apache+Tomcat也可以做集群啊?(我也没做过,网上看的).知道的来说说吧,好长时间都没弄清楚的问题.. 解决方案 在设计J2EE应用时,最重要的设计决策之一是用不用EJB,EJB常常被理解为J2EE的核心,但这是不正确的说法,其实EJB只是J2EE提供给我们的选择之一.它在某个领域

快速处理ListView为空的情况

在移动开发中经常会使用到列表显示,对于列表显示我们经常使用的就是ListView控件.在显示列表的时候通常有两种情况: 一.列表是满的: 二.列表是空的: 在没有数据的时候我们应该怎么处理呢?有一个简单的方法可以解决问题,我们来看一下. ListView和其他继承自AdapterView的类可以使用setEmptyView(View view)方法设置空状态下的显示.当绘制AdapterView的适配器为空或者isEmpty方法返回true,此时就会显示setEmptyView(View vie