Google為什麼不為Android中的RecyclerView添加Item的點擊監聽器?
01-04
正好前不久做過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.....哈,我剛在主動回答這個問題就看到邀請了。
我的理解是現在的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指令集是什麼關係?