【发布时间】:2018-11-27 10:28:51
【问题描述】:
我有一个嵌套的 recyclerview,它应该看起来像 。
我是按照this helpful site实现的。
问题是,有时我的用户拥有数百个项目,在这种情况下,打开活动需要半分钟。
我在后端有一个房间数据库,其中包含两个带有外键(用户和项目)的链接表,我选择所有用户以获取用户/项目列表,其中项目是用户表中的列表。
class userWithItems: (id: Int, name: String, ... ,List)
然后我使用适配器中的项目列表创建内部回收器视图。
创建一个 List UserItems (userid: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 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
}
类 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
}
【问题讨论】:
-
对不起 - 我不认为代码会是大问题,而是概念,因为它只适用于内部适配器中的几个项目。
-
我认为问题在于,在内部回收视图中,即使有 1000 个项目并且在显示器上只能看到 5 或 6 个项目,每个项目都会立即创建,这需要时间。
标签: android performance android-recyclerview kotlin nested