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閱讀 173,595評論 25 708
  • 一、適用場景 ListViewListview是一個很重要的組件,它以列表的形式根據數據的長自適應展示具體內容,用...
    Geeks_Liu閱讀 10,762評論 1 28
  • 孤寂在夜深靜謐中侵襲著 總想用幾句話記錄下此刻 想說的話嘴角盤旋不肯落 你說心里有扇門還上了鎖 我說有能把她融化的...
    沈九壹閱讀 328評論 0 1
  • 人這一生,說長不過短短幾十年,說短卻又讓人能夠體會所有的酸甜苦辣。這一生到頭,說走之路漫漫萬里,所說之話亦有千言萬...
    游春閱讀 168評論 0 0
  • 收拾完行李,看了下手表已經是凌晨兩點。聽到窗外一聲動響,拉開窗簾,發現一只野貓從山梁上滑落下來。正當我要拉上時,放...
    鹿野希_閱讀 1,124評論 10 18