У меня есть вложенное представление переработчика, которое должно выглядеть так: .
Я реализовал его в соответствии с этим полезным сайтом .
Проблема в том, что у меня иногда есть пользователь с сотнями элементов, и в этом случае это занимает половинуминута, чтобы открыть действие.
У меня есть база данных комнаты в бэкэнде с двумя связанными таблицами с внешними ключами (пользователи и элементы), и я выбираю всех пользователей, чтобы получить список пользователей / элементов, где элементы являются спискомв пользовательской таблице.
class userWithItems: (id: Int, name: String, ..., List)
и я создаю внутреннее представление рециркулятора со списком элементов вАдаптер.
Было бы лучше сделать один список UserItems (идентификатор пользователя: Int, имя пользователя: String, ... itemid: Int, itemList) и сгруппировать их для внешнего rv.
ИлиЕсть ли возможность избавиться от вложенного rv и сделать дизайн с помощью всего одного списка просмотрщиков?
Или есть другое решение, чтобы заставить работать вложенный просмотр, даже если у пользователя много элементов?
код для адаптеров:
// Code in Activity: (oncreate)
val recyclerView = findViewById<RecyclerView>(R.id.rv_users)
val adapter = UserAdapter(this)
recyclerView.adapter = adapter
recyclerView.layoutManager = LinearLayoutManager(this)
mainViewModel = ViewModelProviders.of(this, PassIntViewModelFactory(this.application, online_id)).get(MainViewModel::class.java!!)
mainViewModel.userList.observe(this, Observer {
it?.let {
adapter.setUserList(it)
}
})
класс данных UsersWithItems (
val id:Int, val username: String, val address, // fields from user table
val items: List<Items> // list of items for current user
)
Класс данных Items (val id: Int, val itemtext: String, val itemlocation: String, val image: String // ...)
// UserAdapter (снаружи)
класс Внутренний конструктор UserAdapter (контекст: контекст): RecyclerView.Adapter () {
private val inflater: LayoutInflater = LayoutInflater.from(context)
private var userList = emptyList<UsersWithItems>()
inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val username: TextView = itemView.findViewById(R.id.user_name)
val num_pos: TextView = itemView.findViewById(R.id.user_num_pos)
val address: TextView = itemView.findViewById(R.id.user_addr)
val rv:RecyclerView = itemView.findViewById(R.id.rv_user_items)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
val myItemView = inflater.inflate(R.layout.rv_row_user, parent, false)
return MyViewHolder(myItemView)
}
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
val current = userList[position]
holder.username.text="${current.user?.username}"
holder.num_pos.text="${current.items?.size}"
holder.address.text = "${current.user?.address}"
val adapter = UserItemAdapter(holder.rv.context)
adapter.setItems(current.items!!)
holder.rv.adapter = adapter
holder.rv.layoutManager = LinearLayoutManager(holder.rv.context,LinearLayout.VERTICAL,false)
}
internal fun setUserList(userList: List<UsersWithItems>){
this.userList=userList
notifyDataSetChanged()
}
override fun getItemCount() = userList.size
}
class внутренний конструктор UserItemAdapter (контекст: контекст): RecyclerView.Adapter () {
private val inflater: LayoutInflater = LayoutInflater.from(context)
private var itemList = emptyList<Items>()
inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val itemtext: TextView = itemView.findViewById(R.id.item_text)
val itemlocation:TextView = itemView.findViewById(R.id.item_location)
val image: ImageView = itemView.findViewById(R.id.item_image)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
val myItemView = inflater.inflate(R.layout.rv_row_user_items, parent, false)
return MyViewHolder(myItemView)
}
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
val current = itemList[position]
holder.itemtext.text="${current.itemtext}"
holder.itemlocation.text = current.itemlocation
if (current.image.length>0) {
val image = Base64.decode(current.image, 0)
val bitmap = BitmapFactory.decodeByteArray(image, 0, image.size)
holder.image.setImageBitmap(bitmap)
}
}
internal fun setItems(items: List<Items>){
this.itemList=items
notifyDataSetChanged()
}
override fun getItemCount() = itemList.size
}