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,降低了性能消耗。