背景
公司項目開發,首頁有新聞、banner等其他東西,一頁肯定顯示不全,所以套了個ScrollView。新聞一共只顯示4條,默認全部顯示,滑動的時候只滑動ScrollView,!當然,新聞需要用到Ryc。首頁做完都快兩個月了,昨日猛然驚(我)喜(艸)發現,在安卓6.0的機子上,無論后臺返回的新聞條數是多少(大于2,正常情況下只返回4條),界面上都只顯示2條新聞,鬧鬼了!
分析
這種問題,首先想到的是數據設置出錯,打斷點調試!沒錯!那我想應該是Adapter或者ViewHolder的錯,調試發現,Adapter中,雖然getCount()獲取到的數量是正確的,但是,onCreateView和OnBaindView的方法始終只調用了兩次,沒有全部調完!
網上氹了許久,皆不知為何,遂自我分析。
首先,自打用Rcyc起,便一直鐘愛這萬能BaseRecycAdpter,至今一年半載從未出過差錯,其他界面的rcyc也是正常顯示,故可基本排除,非此引起!
其次,此界面亦用了ScollerView,兩者屬性特點皆為滑動,代碼中,設置了Scoller下拉到頂部就觸發刷新數據,兩者滑動是否存在沖突?
實驗
既然如此,重新創建一個TestActivity,layout布局文件先使用自動生成的,把首頁布局中的RcyclerView拷貝進去,同樣的數據同樣的初始化,運行!能夠正常顯示,沒一點問題!!!然后,讓TextActivity加首頁的布局,其他什么都不變,運行!能顯示三個,但不能完全顯示。我再gone了首頁所有其他的組件,只留下rcyc,運行,漂亮,在首頁中,rcyc顯示正常!!!
結論
樣本的唯一性已經表明,首頁rcyc顯示不完全的問題,是和Scrollerview的嵌套產生的,rcyc的核心是ViewHolder,重復利用視圖,rcyc之所以顯示兩個有兩個原因:
1 rcyc在Scrollerview中重寫高度失敗,只能顯示兩個item的高度
2 重寫了LinerLayoutManager的canScrollVertically()方法,禁止了Rcyc的垂直滑動
兩則導致的結果,直接讓人產生的錯覺是rcyc只顯示兩個。如果不重寫canScrollVertically()方法,可以滑動看到其他item,但是rcyc的高度依然只有兩個item的高度。
解決辦法:
網上查詢ScrollView嵌套RecyclerView的問題,千篇一律說的都是重寫LinearLayoutManager,試了幾次,無愛心累,解決不了我的問題!
再次分析,是不是scrollview沒有下拉到底,所以rcyc顯示不完全,在rcyc后新加一個可視化控件,運行,能顯示新加的控件,說明scroller能夠下拉到底,但rcyc還是只顯示兩個item的高度。
或許是疾病亂投醫,瘋了!!!我直接給Rcyc外嵌套一個布局,再設置 android:descendantFocusability="blocksDescendants"
讓它直接獲得焦點(這個屬性可以不用加):
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:descendantFocusability="blocksDescendants">
<android.support.v7.widget.RecyclerView
android:id="@+id/infor_recycle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="5dp"
android:background="#FFFFFF">
</android.support.v7.widget.RecyclerView>
</RelativeLayout>
運行一看,哎喲我去,激動萬分啊!!!終于可以了!!!!android 6.0的機子上能正常顯示了。
巴特、巴特!似乎有點小問題,scroller滑動起來好像不怎么流暢!說白了還是嵌套滑動問題,直接設置
recyclerview.setnestedscrollingenabled(false);//禁止rcyc嵌套滑動
試運行!噢啦!全部解決,老子這個雞凍喲,搞了將近四個小時!
總結
我并沒有重寫LinearLayoutManager,只是嵌套了一層布局。但為什么這樣就可以了,我并沒弄清楚!
碎碎念
無論多么復雜的首頁布局,其實直接用一個Rcyc就可以搞定,而且scroller中嵌套rcyc本身就是個錯誤,
參考 VLayout適配器的萬能封裝
更多問題加群:584275290