android - RecyclerView 适配器中的匿名监听器

标签 android performance android-recyclerview anonymous-class

已编辑:

我想知道在 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 的示例是setClickListeneraddListener 的示例是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/

相关文章:

android - 动画 RecyclerView 高度

java - 使用recyclerview和ListItem在android studio中创建表

android - 为什么调用 Process.killProcess(Process.myPid()) 是个坏主意?

android - 如何在ActionBar中创建一个返回项?

.net - 高性能场景下如何处理 "events"?

c - 寻找函数复杂度指数

Android:在给定 id 的 ListView 中获取项目的位置:

java - 如果其他逻辑在 Android 中不起作用

performance - matlab矩阵运算速度

android - 在回收者 View 中检测上一个项目