Проблемы с вложенным переработчиком

E. Reuter спросил: 03 ноября 2018 в 08:48 в: android

У меня есть вложенное представление переработчика, которое должно выглядеть на .

, полезном для этого, в соответствии с этим. >

Проблема в том, что у меня иногда есть пользователь с сотнями элементов, и в этом случае требуется полминуты, чтобы открыть действие.

У меня есть база данных комнаты в бэкэнде с двумя связанные таблицы с внешними ключами (пользователи и элементы), и я выбираю всех пользователей, чтобы получить список пользователей / элементов, где элементы представляют собой список в таблице пользователей.

класс userWithItems: (id: Int, name : String, ..., List)

и я создаю внутреннее представление рециркулятора со списком элементов в адаптере.

Было бы лучше сделать один список UserItems (идентификатор пользователя) : Int, username: String, ... itemid: Int, itemList) и сгруппировать их для внешнего rv.

Или есть возможность избавиться от вложенного rv и сделать дизайн всего одним recyclerview-list?

Или есть другое решение для создания вложенного Работает ли просмотрщик, даже если у пользователя много элементов?

код для адаптеров:

// 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

)

Элементы класса данных (val id: Int, val itemtext: String, val item_location: String, val image: String // ...)

// UserAdapter (снаружи)

class Внутренний конструктор 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

}

внутренний конструктор класса 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

}

0 ответов