반응형

RecyclerView

설명

  • 많은 수의 데이터 항목을 제한된 영역 내에서 유연하게 표시할 수 있도록 만들어주는 위젯
  • 리스트뷰보다 유연함과 성능이 향상된 위젯
  • 구글에서도 ListView 대신 RecyclerView를 사용하도록 권장

코드

CustomDataBinding
object CustomDataBinding {
    @BindingAdapter("adapter")
    @JvmStatic
    fun adapter(recyclerView: RecyclerView, adapter: RecyclerView.Adapter<*>) {
        recyclerView.adapter = adapter
    }
}
User
class User(var id: Int?, var name: String?)
res/layout/view_user.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable
            name="user"
            type="com.example.android_example.User" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:orientation="horizontal">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{String.valueOf(user.id)}" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text=" / " />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.name}" />
    </LinearLayout>
</layout>
UserViewAdapter
class UserViewAdapter : RecyclerView.Adapter<UserViewAdapter.ViewHolder>() {
    private var userList = ArrayList<User>()

    fun initUserList(userList: ArrayList<User>) {
        this.userList = userList
    }

    fun addUser(user: User) {
        this.userList.add(user)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val binding = ViewUserBinding.inflate(LayoutInflater.from(parent.context), parent, false)

        return ViewHolder(binding)
    }

    override fun getItemCount(): Int {
        return userList.size
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.bind(userList[position])
    }

    class ViewHolder(private val binding: ViewUserBinding) : RecyclerView.ViewHolder(binding.root) {
        fun bind(user: User) {
            binding.user = user
        }
    }
}
res/layout/activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>
        <variable
            name="context"
            type="com.example.android_example.MainActivity" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:orientation="vertical">

        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="@{context::onClick}"
            android:text="click" />

        <androidx.recyclerview.widget.RecyclerView
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            app:adapter="@{context.adapter}"
            app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
    </LinearLayout>
</layout>
MainActivity
class MainActivity : AppCompatActivity() {
    lateinit var binding: ActivityMainBinding
    lateinit var adapter: UserViewAdapter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = ActivityMainBinding.inflate(layoutInflater).apply {
            setContentView(root)
            lifecycleOwner = this@MainActivity
            context = this@MainActivity
        }

        adapter = UserViewAdapter()
        adapter.initUserList(ArrayList<User>().apply {
            for (i in 1..100) {
                add(User(id = i, name = "name - $i"))
            }
        })
    }

    fun onClick(view: View) {
        adapter.addUser(User(1000, "Tom"))
        adapter.addUser(User(1001, "John"))
        adapter.notifyDataSetChanged()
    }
}

참고

반응형

'Development > Android' 카테고리의 다른 글

[Android] OptionMenu  (0) 2021.02.09
[Android] Activity  (0) 2021.02.09
[Android] ViewPager  (0) 2021.02.09
[Android] Spinner  (0) 2021.02.09
[Android] ListView  (0) 2021.02.09

+ Recent posts