Shawlaw的Android周记 2016年8月7日

1、使用EventBus进行组件间通信时,要注意EventBus这个消息分发器是无法区分List这类的泛型对象的,因为Java的泛型在编译时会进行类型擦除。List都会被擦除成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,降低了性能消耗。

你可能感兴趣的:(Shawlaw的Android周记 2016年8月7日)