Shawlaw的Android周记 2016年8月7日

1、使用EventBus进行组件间通信时,要注意EventBus这个消息分发器是无法区分List<AnyClass>这类的泛型对象的,因为Java的泛型在编译时会进行类型擦除。List<AnyClass>都会被擦除成List类型,所以如果同时在多个组件中订阅了List类型,不管List声明的泛型是什么,都会收到EventBus的事件。那么如果使用泛型来区分事件的话,在后续的逻辑中就有可能调用了错误的方法或者产生ClassCastException。
  解决方案:取到订阅的消息后,对List中的item进行类型检查,通过则执行后续逻辑,否则不执行。
       或者,定义多个消息包裹类,每个类里面仅有对应的泛型List作为属性存在。

2、在style.xml中给应用定义的theme,在有时候可能会由于某些限制不能使用最新的Material主题,而这时候应用中的ListView、GridView的item的点击效果就会很难看,而设计中的点击效果又不能简单地使用selector来实现,那这时候可以在ListView、GridView的xml中的加入一行属性来从视觉上屏蔽掉默认主题对应的点击效果。加入的属性就是
android:listSelector="@android:color/transparent"
这个属性把点击效果设定为透明,所以视觉上就看不出来。不过这种解决方案并不优美,建议是多加思考看看到底能不能用selector来实现点击效果,实在不行再用这种方式屏蔽然后再在代码中改变样式。

3、要在ListView中单独刷新一个item,主要是要持有对应的itemView的引用,然后调用内部的组件重新设置属性值即可。可以通过在Adpater中维护一个数据源的position与在展示的itemView之间的对应关系表,每通知要刷新一个item的数据时,先检查该item的position有没有对应的正在展示的itemView(即要更新的数据是否正在ListView中显示),有的话则取出对应的itemView然后设置属性值即可,若无则直接修改数据源的内容即可,下次绘制到这个item时就是使用新数据来进行绘制的了,这样就避免了每来更新一个item的消息时都要调用notifyDataSetChanged()来重绘所有可见item,降低了性能消耗。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,989评论 25 708
  • 一、适用场景 ListViewListview是一个很重要的组件,它以列表的形式根据数据的长自适应展示具体内容,用...
    Geeks_Liu阅读 10,717评论 1 28
  • 孤寂在夜深静谧中侵袭着 总想用几句话记录下此刻 想说的话嘴角盘旋不肯落 你说心里有扇门还上了锁 我说有能把她融化的...
    沈九壹阅读 323评论 0 1
  • 人这一生,说长不过短短几十年,说短却又让人能够体会所有的酸甜苦辣。这一生到头,说走之路漫漫万里,所说之话亦有千言万...
    游春阅读 166评论 0 0
  • 收拾完行李,看了下手表已经是凌晨两点。听到窗外一声动响,拉开窗帘,发现一只野猫从山梁上滑落下来。正当我要拉上时,放...
    鹿野希_阅读 1,115评论 10 18