踩坑
其實之前也遇到過這個問題,用戶說recyclerview中某個item無法點擊,是oppo某一機型,但是在其他手機和模擬器都沒有出現(xiàn)該問題,以為只是oppo特定版本系統(tǒng)的兼容性問題。
然后在最近提測的一個版本中很多手機也出現(xiàn)了類似的問題(我經(jīng)常用模擬器運行調(diào)試,以及自己手機最新MIUI11安卓10,都沒有發(fā)現(xiàn)這種問題)。recyclerview中,第一項中的子內(nèi)容可以點擊,但是第二項點擊無效,獲取不了焦點,滑動到第三項又可以。
原因
回去思考了一下,注意到每次這個recyclerview加載內(nèi)容后,他的第一項的第一個EditText總是第一時間獲取了焦點,并且有光標在閃爍。所以考慮,應(yīng)該是Item布局中的EditText第一時間獲取焦點導(dǎo)致的,而且滑動的時候,我的recyclerview一屏,只有2項,所以奪去了第二項的焦點,滑動到第三項的時候,第一項可能已經(jīng)被回收,釋放了焦點,所以又可以點擊了。
尋找答案
然后Google了一下EditeText不在一開始獲取焦點,沒想到這個問題在stack overflow中也很多贊,2k+,回答也結(jié)果也很實用。
一般都是采取在其父布局中添加 android:focusableInTouchMode="true"屬性。直譯理解是,允許在觸摸模式中獲取焦點。
如此設(shè)置后recyclerview滑動時,因為會點擊到父布局,所以會把EditText的焦點移除了,從而避免即使滑動EditText也持有焦點的問題。
而我是采用了另外一種方案,額外添加android:descendantFocusability="beforeDescendants"屬性,直譯理解是,子孫布局焦點配置。beforeDescendants意思是在子孫布局之前獲得焦點,即優(yōu)先度高于子布局。
結(jié)論
如果你也是跟我一樣,在RecyclerView的Item中使用EditText,那么建議你在頂層容器布局中,添加
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"