Google為什麼不為Android中的RecyclerView添加Item的點擊監聽器?


正好前不久做過RecycleView的源碼分析,這裡說明一下好了。。

其中一個原因是RecyclerView的Item支持動畫。。舉個栗子。如果你開啟了RecyclerView的Item動畫,當你刪除了position位於1的Item之後, 此時位於23456...的position會向前一格變成12345,而被刪除的那個view也會留在RecycleView上繼續執行動畫直到結束。如下圖所示

於是這時候RecycleView中會留有兩個position為1的View....

此時點擊那個被刪除的view的話就蛋疼了。。

因為Adapter中已經沒有這個item了,如果用position 1去adapter中取的話,得到的是原來positon為2的那個item.....

另外,RecyclerView的設計也有很大一部分原因,按照RecyclerView的設計,RecyclerView負責控制/框架,LayoutManager負責計算布局,假設將ItemClickListener放到RecyclerView上,如果要實現點擊事件,首先需要確定每一個item的點擊區域。但是RecyclerView無法知道每一個item的點擊區域,因為LayoutManager是可以由開發者來實現的,也就是說兩個View的區域是允許重疊的。如果點了A和B重疊區域到底是觸發A還是B,又必須要由LayoutManager來決定。所以還不如直接放到LayoutManager中,但如果放到LayoutManager中的話需要給RecyclerView添加OnTouchListener,看上去又很彆扭(要是外部給RecyclerView設置OnTouchListener會覆蓋掉這個導致ItemClickListener失效)所以google乾脆就不幹了,至少還能保持源碼的整潔-。-(ListView中有一個很複雜的狀態機就是用來維護Click點擊態的)


哈,我剛在主動回答這個問題就看到邀請了。

我的理解是現在的ViewHolder已經記錄了其位置,所以自己設定OnClickListener也並不會找不到相應的View和Item。另外,RecyclerView已經不像之前ListView那樣功能單一了,對待一個Item View可能需要的也不是點擊,而是Drag Drop、Slide等複雜的手勢,單獨加一個OnClickListener不太合適。


請問為神馬谷歌不從根本上解決方法數問題?


額,實際的需求中,經常給listView添加headerView和footerView,添加之後setOnItemClickListener設置的監聽器能取得headerView和footerView的position位置,但其實header和footer我是不需要去添加點擊事件的,這樣從我的listView的數據中根據position找對應的一項可能發生數組越界。而RecyclerView中對View的type進行分類更容易了,不同type的view可能數據也不同了,這樣如果統一的setOnItemClickListener好像是不太好的了.......思路有點亂


RecyclerView出現已經有一段時間了,相信大家肯定不陌生了,大家可以通過導入support-v7對其進行使用。

據官方的介紹,該控制項用於在有限的窗口中展示大量數據集,其實這樣功能的控制項我們並不陌生,例如:ListView、GridView。

那麼有了ListView、GridView為什麼還需要RecyclerView這樣的控制項呢?整體上看RecyclerView架構,提供了一種插拔式的體驗,高度的解耦,異常的靈活,通過設置它提供的不同LayoutManager,ItemDecoration , ItemAnimator實現令人瞠目的效果。

  • 你想要控制其顯示的方式,請通過布局管理器LayoutManager
  • 你想要控制Item間的間隔(可繪製),請通過ItemDecoration
  • 你想要控制Item增刪的動畫,請通過ItemAnimator
  • 你想要控制點擊、長按事件,請自己寫(擦,這點尼瑪。)

Android RecyclerView 使用完全解析 體驗藝術般的控制項 詳見 BLog

這樣子可定製性更高,可以針對具體的需求來定製不同位置的響應事件,包括但不限於點擊。 默認給 RecyclerView 這個 OnClick 事件監聽的話不妥。 RecyclerView 比起 ListView 有更多的擴展性,完全秒殺 ListView 。


目前,在參與 BaseRecyclerViewAdapterHelper 框架構建 時,我將 click 事件從 adapter 中分離出來 ,但是更遇到了 item selector 背景色 無法正常切換 ,看來,Google 不這麼干是有道理的,因為情形太多。。


昨晚遇到這個問題,看到overflow上有人說可以在你的Adapter裡面自己設置一個介面。

我嘗試了一下在onBindViewHolder裡面可以監聽你要訪問的item里的具體內容(比如按鈕),而且可以很方便的獲得position,可以知道是哪個item的。 然後在你創建適配器的時候調用介面就好了。


推薦閱讀:

如何自定義隨機數函數?
怎樣理解或評價面向對象的編程技術?
如何從零基礎做出類似拳皇一類的動作類2D遊戲?
SPFA演算法可否取代Dijkstra演算法成為計算單源最短路徑的最優解?
彙編指令集與cpu指令集是什麼關係?

TAG:編程 | Android開發 | 谷歌Google | Android |