Android ListView条目按钮点击状态混乱解决方案

出现问题:

    点击listView item上的button按钮,点击改变button的显示状态,滑动listView条目上的button被复用,条目上对应button状态不对应,条目上button状态混乱。

分析原因:

   ListView item缓存机制:为了使得性能更优,ListView会缓存行item(某行对应的View)。ListView通过Adapter的getView函数获得每行的item。滑动过程中,

   a.如果某行item已经滑出屏幕,若改item不在缓存内,则put进缓存,否则更新缓存;

   b.获取滑入屏幕的行item之前会先判断缓存中是否有可用的item,如果有,作为convertView参数传递给adapter的getView。

   这样,getView写法就可以充分利用缓存大大提升ListView的性能。即便上万个行item,最多inflate的次数为n,n为一屏最多显示ListView行item的个数。

   根据上面的缓存原理,listView的复用,便会造成item上控件状态的混乱。

   具体分析详见     http://www.trinea.cn/android/android-listview-display-error-image-when-scroll/

解决方案:

   Java编程思想万物皆对象。如果把item的状态记录在 每item上对应对象中,通过对象的字段,每次点击改变对象的字段值,每次显示item上控件的状态通过判断对象字段值。混乱状态问题,便得解决。

  无故为条目对象增加字段,而服务器上并不需要该字段,为了统一前后端,这样又会造成麻烦。所以,我们在给对象添加,状态判断的boolean值时,在bean中的该字段前加字段修饰关键字 transient 。For example,bean中添加的判断boolean值为isCheck,那么在bean中则为 private transient boolean isCheck;

  transient 顾名思义: (From Youdao Dict)

  • adj. 短暂的;路过的
  • n. 瞬变现象;过往旅客;候鸟

而在java中,“transient”修饰符(modifier)就是一个专用的annotation,用来表明被修饰的字段(field)在序列化(serilization)的时候被忽略。

具体分析详见    http://www.cnblogs.com/gaojing/archive/2011/04/14/2844973.html

总结:

   所以,给条目对象,增加字段(为了记录该对象的状态),并在字段前加 transient 修饰关键字,便可迎刃而解ListView条目按钮点击状态混乱问题~

你可能感兴趣的:(解决方案)