已采纳回答 / qq_仙人掌_3
打上log你可以看到,gridview在进行getView显示时,position=0在开头和最后进行了重复调用(原因是gridView的机制决定的,会尝试将第一个元素多次生成来进行布局的计算,因此position=0会在最开头和最后都出现convertView == null 的情形)。在原代码中,每次convertView ==null我们都会重新生成一个button,因此最后这个button会在ArrayList中覆盖掉第一个(因为postion都是0)。但实际上这最后生成的只是系统用来重新算布局用...
2015-06-11
属性private,然后使用getter,setter提供访问符合JavaBean的封装性,但相对的也增加了一点复杂性,WordButton中的属性的作用都是用来存取值之用,并没有涉及到对属性的非法访问控制,所以不使用getter,setter倒也挺好,使用时方便。
2015-06-10
自定义GridView,把视图层与数据适配封装到一起,以带功能的视图模块在逻辑层使用,让我想起了Fragment这家伙也是这么使用的,妙,这样代码的复用性会很好。
2015-06-10
按照MVC框架思想,数据模型层和视图层要尽可能的解耦,WordButton做为数据模型层,其中通过组合的方式包含和Button这样的视图控件,老师牺牲了代码的框架和阅读性,实效是确实降低了控制逻辑层的复杂性。以前很少使用这种编程方式,今天又学到了!感谢!
2015-06-10
WordButton中的可见性属性mIsVisible在整个代码中没有用他去做WordButton的显示和隐藏,都是在需求显示和隐藏的时候主动调用控件的setVisible()方法来完成的。其实如果在Adapter的getView方法中通过判断mIsVisible来控制WordButton的显示和隐藏,这样在MainActivity中在控制WordButton的显示或隐藏时为mIsVisible属性赋ture为false后,直接使用Adapter的刷新方法就完成了效果,比专门又封装和调用setWordButtonVisible()方法简便一些同时又真正使用了mIsVisible属性。
2015-06-10
如果唱片动画开始播放,播放控制按钮就隐藏,就不会有机会在播放状态去调用HandlePlayButton()方法了,这样mIsRunning就不会被判断,最终也就不会执行startAnimation()方法,所以其实没有必要使用mIsRunning变量。
2015-06-10
mBarOutAnim结束时应该不需要设置mBarOutAnim.setFillAfter(true)?
这个还是需要有这个设置的,或者在代码中设置,或者在XML布局中通过属性设置,mBarOutAnim的原始位置是读盘位置,如果不设置fillAfter(true)的话,播杆运动完后又会回到读盘位置。
这个还是需要有这个设置的,或者在代码中设置,或者在XML布局中通过属性设置,mBarOutAnim的原始位置是读盘位置,如果不设置fillAfter(true)的话,播杆运动完后又会回到读盘位置。
2015-06-10
这个问题我也想过,不过结合实际,如果唱片先转的话,播杆读到的数据就读不到唱片已转过的那些数据了,所以播杆先过来准备读数据,然后唱片开始转动这样的顺序是符合实际的,我第一次做的时候是先让唱片转,然后监听唱片动画的开始,然后在唱片动画开始的时候再让播杆执行读动画,但这样虽然从效果上人眼看不出问题,但因为播杆需要300毫秒过来,也就有300毫秒的误差,精确度不够好,不过也要看具体要求了,如果唱片也在300毫秒内存放数据就没有这样的误差问题了。
2015-06-10