반응형
RecyclerView
설명
- 많은 수의 데이터 항목을 제한된 영역 내에서 유연하게 표시할 수 있도록 만들어주는 위젯
- 리스트뷰보다 유연함과 성능이 향상된 위젯
- 구글에서도 ListView 대신 RecyclerView를 사용하도록 권장
코드
CustomDataBindingobject 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 |