已编辑:
我想知道在 bindViewHolder
方法中创建 Anonymous Listener 是否会导致大型数据集出现任何性能问题。
假设我有一个RecyclerView 适配器。在 bindViewHolder
方法中,如果我将所有监听器设置为匿名,这会导致任何性能问题吗?因为当用户滚动 RecyclerView 时,它会创建大量匿名监听器并将它们设置为 View 。
示例:
view.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
}
});
或者我可以在我的 ViewHolder 类中实现 OnClickListener
并添加到 View 中。就像
view.setOnClickListener(this);
这里没有创建很多匿名监听器。这是否比以前在大型数据集的性能计算中表现更好?
提前致谢。
最佳答案
RecyclerView
只会显示很少的项目,ViewHolder
只会为可见的项目创建,所以即使您的适配器中有数千个项目,也只会显示一小部分ViewHolders
已创建。
但是你必须小心使用 addListener
方法,对于大多数 setListener
方法,你将在项目被回收时一次又一次地设置相同的监听器,这不会只需不到几毫秒,因为它只保留对监听器实现的引用。
但是使用addListener
,您必须在添加新监听器之前删除旧监听器。
setListener
的示例是setClickListener
,addListener
的示例是addTextWatcher
//.. part of adapter
private TextWatcher textWatcher;
public void bindViewHolder(DataViewHolder holder, int index){
// no performance issue
holder.button.setClickListener( .... );
// wrong, this is added everytime
holder.editText.addTextWatcher( .... );
// this is safe...
if(textWatcher != null)
holder.editText.removeTextWatcher(textWatcher);
textWatcher = new TextWatcher(){
// ... implementation
};
holder.editText.addTextWatcher(textWatcher);
}
关于android - RecyclerView 适配器中的匿名监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46504192/