Оптимизация RecyclerView AndroidStudio на Kotlin
Пишу что-то вроде социальной сети. Пользователь создаёт пост с картинкой и текстом, загружает его. Далее этот пост отображается в ленте RecyclerView. Адаптер задаёт информацию о пользователе, то есть имя, аватар:
private fun publisherInfo(profileImage: CircleImageView, userName: TextView, publisher: TextView, publisherID: String)
{
val usersRef = FirebaseDatabase.getInstance().reference.child("Users").child(publisherID)
usersRef.addValueEventListener(object : ValueEventListener
{
override fun onDataChange(p0: DataSnapshot)
{
if (p0.exists())
{
val user = p0.getValue<User>(User::class.java)
Picasso.get().load(user!!.getImage()).into(profileImage)
userName.text = user!!.getUsername()
publisher.text = user!!.getFullname()
}
}
override fun onCancelled(error: DatabaseError)
{
}
})
}
Если я использую Glide вместо Picasso, то вроде не так сильно тормозит, но делать я этого не могу из-за ряда причин. Сами посты отображаются во фрагменте:
private fun retrievePosts() {
val postsRef = FirebaseDatabase.getInstance().reference.child("Posts")
postsRef.addValueEventListener(object : ValueEventListener
{
override fun onDataChange(p0: DataSnapshot)
{
postList?.clear()
for (snapshot in p0.children)
{
val post = snapshot.getValue(Post::class.java)
for (id in (followingList as ArrayList<String>))
{
if (post!!.getPublisher() == id)
{
postList!!.add(post)
}
postAdapter!!.notifyDataSetChanged()
}
}
}
override fun onCancelled(error: DatabaseError)
{
}
})
}
Но при прокрутке происходят ужасные зависания. Что мне делать?
class PostAdapter (private val mContext: Context, private val mPost: List) : RecyclerView.Adapter<PostAdapter.ViewHolder>() { private var firebaseUser: FirebaseUser? = null
var currentUserId: String = ""
var userId: String = ""
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder
{
val view = LayoutInflater.from(mContext).inflate(R.layout.posts_layout, parent, false)
return ViewHolder(view)
}
override fun getItemCount(): Int {
return mPost.size
}
@SuppressLint("WrongConstant")
@RequiresApi(Build.VERSION_CODES.O)
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
firebaseUser = FirebaseAuth.getInstance().currentUser
currentUserId = FirebaseAuth.getInstance().currentUser!!.uid
val post = mPost[position]
Glide.with(mContext).load(post.getPostimage()).into(holder.postImage)
if (post.getDescription().equals(""))
{
holder.description.visibility = View.GONE
}
else
{
holder.description.visibility = View.VISIBLE
holder.description.setText(post.getDescription())
}
publisherInfo(holder.profileImage, holder.userName, holder.publisher, post.getPublisher())
}
inner class ViewHolder(@NonNull itemView: View) : RecyclerView.ViewHolder(itemView)
{
var profileImage: CircleImageView
var postImage: ImageView
var userName: TextView
var publisher: TextView
var description: TextView
init {
profileImage = itemView.findViewById(R.id.user_profile_image_post)
postImage = itemView.findViewById(R.id.post_image_content)
userName = itemView.findViewById(R.id.username_post)
publisher = itemView.findViewById(R.id.publisher)
description = itemView.findViewById(R.id.description)
}
}
private fun publisherInfo(profileImage: CircleImageView, userName: TextView, publisher: TextView, publisherID: String)
{
val usersRef = FirebaseDatabase.getInstance().reference.child("Users").child(publisherID)
usersRef.addValueEventListener(object : ValueEventListener
{
override fun onDataChange(p0: DataSnapshot)
{
if (p0.exists())
{
val user = p0.getValue<User>(User::class.java)
Picasso.get().load(user!!.getImage()).into(profileImage)
userName.text = user!!.getUsername()
publisher.text = user!!.getFullname()
}
}
override fun onCancelled(error: DatabaseError)
{
}
})
}
class User
{
private var username: String = ""
private var fullname: String = ""
private var image: String = ""
private var uid: String = ""
constructor()
constructor(username: String, fullname: String, image: String, uid: String)
{
this.username = username
this.fullname = fullname
this.image = image
this.uid = uid
}
fun getUsername(): String
{
return username
}
fun setUsername(username: String)
{
this.username = username
}
fun getFullname(): String
{
return fullname
}
fun setFullname(fullname: String)
{
this.fullname = fullname
}
fun getImage(): String
{
return image
}
fun setImage(image: String)
{
this.image = image
}
fun getUID(): String
{
return uid
}
fun setUID(uid: String)
{
this.uid = uid
}
}
Ответы (1 шт):
Можно улучшить производительность, если добавить вызов fit() после load(url).
Picasso.get()
.load(user!!.getImage())
.fit()
.into(profileImage)
Также несколько советов по оптимизации RecyclerView можно найти тут: https://stackoverflow.com/a/39797947/3212712