Android在開發(fā)中的使用技巧之解決ScrollView嵌套R(shí)ecyclerView出現(xiàn)的系列問(wèn)題

根據(jù)已上線的app里總結(jié)出來(lái)的實(shí)用小技巧

相信大家都遇到過(guò)ScrollView嵌套RecyclerView或者RecyclerView嵌套RecyclerView來(lái)使用, 也會(huì)遇到一堆奇奇怪怪的問(wèn)題, 比如滑動(dòng)卡頓、數(shù)據(jù)加載不完、數(shù)據(jù)加載完后沒(méi)有停留在頂部等問(wèn)題

今天我們就來(lái)寫一篇RecyclerView嵌套版本的解決方案

  • 今年六月份的IO大會(huì)把Kotlin用做Android開發(fā)的一級(jí)語(yǔ)言, 也讓這個(gè)語(yǔ)言在Android開發(fā)圈子里大火了一把, 所以今天的代碼是用Kotlin來(lái)實(shí)現(xiàn)(當(dāng)然還是有Java版本的).

  • 由于Google公司大力推薦大家使用RecyclerView來(lái)代替ListViewGridView等等控件, 現(xiàn)在越來(lái)越多的開發(fā)者都已經(jīng)上手了RecyclerView了.

  • 也推薦大家趕緊使用RecyclerView來(lái)代替ListView等等, 好處太多了也就不提了, 配合github上的一個(gè)開源工程使用簡(jiǎn)直絕配BaseRecyclerViewAdapterHelper

進(jìn)入正題, 不多BB了

1. 第一種情況

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

RecyclerView嵌套R(shí)ecyclerView示例
2.第二種情況

一個(gè)頁(yè)面中有個(gè)多個(gè)RecyclerView時(shí),為了保證數(shù)據(jù)能完整加載, 一般都是在最外層加上一個(gè)ScrollView, 然而出現(xiàn)的一系列問(wèn)題, 讓人頭大, 當(dāng)然本文章也都提供了解決方案

ScrollView嵌套兩個(gè)RecyclerView示例

之前也寫過(guò)一篇ScrollView嵌套ListViewGridView等控件出現(xiàn)的各種問(wèn)題的解決的最佳方案, 傳送門點(diǎn)我

  • Java版本
recyclerView.setLayoutManager(new LinearLayoutManager(this){
      @Override
      public boolean canScrollVertically() {
         //解決ScrollView里存在多個(gè)RecyclerView時(shí)滑動(dòng)卡頓的問(wèn)題
         //如果你的RecyclerView是水平滑動(dòng)的話可以重寫canScrollHorizontally方法
         return false;
      }
});
//解決數(shù)據(jù)加載不完的問(wèn)題
recyclerView.setNestedScrollingEnabled(false);
recyclerView.setHasFixedSize(true);
//解決數(shù)據(jù)加載完成后, 沒(méi)有停留在頂部的問(wèn)題
recyclerView.setFocusable(false);
  • Koltin版本
recyclerView.layoutManager = object : LinearLayoutManager(context) {
       //解決RecyclerView嵌套R(shí)ecyclerView滑動(dòng)卡頓的問(wèn)題
       //如果你的RecyclerView是水平滑動(dòng)的話可以重寫canScrollHorizontally方法
      override fun canScrollVertically() = false
}
//解決數(shù)據(jù)加載不完的問(wèn)題
recyclerView.isNestedScrollingEnabled = false
recyclerView.setHasFixedSize(true)
//解決數(shù)據(jù)加載完成后, 沒(méi)有停留在頂部的問(wèn)題
recyclerView.isFocusable = false
  • 切記,切記,切記, 重要的事情說(shuō)三遍, 還解決不了的時(shí)候看這里

關(guān)于嵌套后滑動(dòng)卡頓或者焦點(diǎn)之類的問(wèn)題
使用了上面的方法還無(wú)法解決就把布局中的RecyclerView外層的ScrollView換成NestedScrollView就可以解決了

大概就改成這樣
<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>
如果還有遇到什么其他的嵌套之類出現(xiàn)的問(wèn)題可以在評(píng)論里留言

轉(zhuǎn)載請(qǐng)注明 原文出處
有錯(cuò)誤請(qǐng)多多指正!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,355評(píng)論 25 708
  • afinalAfinal是一個(gè)android的ioc,orm框架 https://github.com/yangf...
    passiontim閱讀 15,899評(píng)論 2 45
  • 只要你真的想去這樣生活,你就一定可以做到這樣去生活。
    懶大叔閱讀 418評(píng)論 0 0
  • 大學(xué)以來(lái),我很少給父母打電話。打電話也是匆匆?guī)拙渚蛼斓?。每次放假回家就渾身不舒服,好像被針扎著一樣?/div>
    改造貓貓閱讀 250評(píng)論 1 1
  • 歲月輕輕地觸摸 悠悠歌聲中最柔軟的角落 滴答滴答的雨聲 彈奏著雨燕的歡歌 懷揣在夢(mèng)里的星星 在小小的心懷里閃爍 拈...
    伊萬(wàn)公津閱讀 331評(píng)論 4 2

友情鏈接更多精彩內(nèi)容