Android在開發中的使用技巧之解決ScrollView嵌套RecyclerView出現的系列問題

 

根據已上線的app裏總結出來的實用小技巧

相信你們都遇到過ScrollView嵌套RecyclerView或者RecyclerView嵌套RecyclerView來使用, 也會遇到一堆奇奇怪怪的問題, 好比滑動卡頓、數據加載不完、數據加載完後沒有停留在頂部等問題

今天咱們就來寫一篇RecyclerView嵌套版本的解決方案java

  • 今年六月份的IO大會把Kotlin用作Android開發的一級語言, 也讓這個語言在Android開發圈子裏大火了一把, 因此今天的代碼是用Kotlin來實現(固然仍是有Java版本的).android

  • 因爲Google公司大力推薦你們使用RecyclerView來代替ListViewGridView等等控件, 如今愈來愈多的開發者都已經上手了RecyclerView了.git

  • 也推薦你們趕忙使用RecyclerView來代替ListView等等, 好處太多了也就不提了, 配合github上的一個開源工程使用簡直絕配BaseRecyclerViewAdapterHelpergithub

進入正題, 很少BB了app

1. 第一種狀況

兩層RecyclerView嵌套這種需求也是很常見的一個需求了, 下面圖片就是列舉的一個案例ide

 
RecyclerView嵌套RecyclerView示例
2.第二種狀況

一個頁面中有個多個RecyclerView時,爲了保證數據能完整加載, 通常都是在最外層加上一個ScrollView, 然而出現的一系列問題, 讓人頭大, 固然本文章也都提供瞭解決方案佈局

 
ScrollView嵌套兩個RecyclerView示例

以前也寫過一篇ScrollView嵌套ListViewGridView等控件出現的各類問題的解決的最佳方案, 傳送門點我this

  • Java版本
recyclerView.setLayoutManager(new LinearLayoutManager(this){ @Override public boolean canScrollVertically() { //解決ScrollView裏存在多個RecyclerView時滑動卡頓的問題 //若是你的RecyclerView是水平滑動的話能夠重寫canScrollHorizontally方法 return false; } }); //解決數據加載不完的問題 recyclerView.setNestedScrollingEnabled(false); recyclerView.setHasFixedSize(true); //解決數據加載完成後, 沒有停留在頂部的問題 recyclerView.setFocusable(false); 
  • Koltin版本
recyclerView.layoutManager = object : LinearLayoutManager(context) {
       //解決RecyclerView嵌套RecyclerView滑動卡頓的問題 //若是你的RecyclerView是水平滑動的話能夠重寫canScrollHorizontally方法 override fun canScrollVertically() = false } //解決數據加載不完的問題 recyclerView.isNestedScrollingEnabled = false recyclerView.setHasFixedSize(true) //解決數據加載完成後, 沒有停留在頂部的問題 recyclerView.isFocusable = false 
  • 切記,切記,切記, 重要的事情說三遍, 還解決不了的時候看這裏

關於嵌套後滑動卡頓或者焦點之類的問題
使用了上面的方法還沒法解決就把佈局中的RecyclerView外層的ScrollView換成NestedScrollView就能夠解決了spa

大概就改爲這樣
<android.support.v4.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="wrap_content" /> <android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> </android.support.v4.widget.NestedScrollView> 
相關文章
相關標籤/搜索