일모도원(日暮途遠) 개발자

[안드로이드UI] 어댑터에서 모든 아이템이 binding되는게 레이아웃 이슈라니... 본문

안드로이드 개발/UI관련

[안드로이드UI] 어댑터에서 모든 아이템이 binding되는게 레이아웃 이슈라니...

달님개발자 2023. 4. 11. 00:18

리스트가 600개 정도 되는데 이게 전부 다 어댑터에서 binding이 되고 있어서 무척 느리다. 삽질 끝에 소스코드가 아닌, 레이아웃쪽에 문제가 있다는걸 알았다.

원인은 아래 코드가 문제였다.

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/innerLayout"

        app:layout_constraintBottom_toTopOf="@+id/nvBottom">

 

저 코드로 인해서 리사이클 뷰의 높이가 제대로 안구해져서 어댑터에서 높이에 해당되는 아이템만 바인딩하는게 아니라 리스트내의 모든 아이템을 바인딩 해서 오류가 발생했다. (왜 저코드가 문제인지는 정확히는 잘 모르겠다...)

안되는거
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.dalread.component.Toolbar
        android:id="@+id/header" />

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/innerLayout"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintTop_toBottomOf="@id/header"
        app:layout_constraintBottom_toTopOf="@+id/nvBottom">

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/rvInfo"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            tools:itemCount="10"
            tools:listitem="@layout/item_voca_4buttons" />

 
    </androidx.constraintlayout.widget.ConstraintLayout>
    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/nvBottom"
        style="@style/WidthMatch"
        android:layout_alignParentBottom="true"
        app:menu="@menu/menu_bottom_word_list"
        app:layout_constraintTop_toBottomOf="@+id/innerLayout"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

아래처럼 고치면 바인딩이 이슈는 해결되지만 UI문제가 생긴다.
<androidx.constraintlayout.widget.ConstraintLayout
  android:id="@+id/innerLayout"

  app:layout_constraintBottom_toBottomOf="parent">

즉 이런씩으로 BottomNavigationView가 일부 잘려져 나온다.

 

 

내경우에는 ConstraintLayout 안에 다시 ConstraintLayout으로 레이아웃을 만들지 않아도 되어서 안에서는 그냥 LinearLayout으로 해결했다.

아래코드는 그냥 참고만 하자.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/llRoot"
    style="@style/ViewBase"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:id="@+id/llMain"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:orientation="vertical"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent">

        <com.dalread.component.Toolbar
            android:id="@+id/header"
            style="@style/WidthMatch"
            app:leftIcon="@drawable/ic_back"
            app:rightText="@string/menu"
            app:title="@string/tb_word_list"/>

        <me.zhanghai.android.fastscroll.FastScrollScrollView
            android:id="@+id/fssvPreview"
            android:background="@color/backgroundColor"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <androidx.recyclerview.widget.RecyclerView
                android:id="@+id/rvInfo"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                tools:itemCount="2"
                tools:listitem="@layout/item_voca_4buttons" />
        </me.zhanghai.android.fastscroll.FastScrollScrollView>

    </LinearLayout>


    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/nvBottom"
        style="@style/WidthMatch"
        android:layout_alignParentBottom="true"
        app:itemBackground="@color/backgroundColor"
        app:itemIconTint="@drawable/selector_voca"
        app:itemTextColor="@drawable/selector_voca"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:menu="@menu/menu_bottom_word_list" />

</androidx.constraintlayout.widget.ConstraintLayout>