Android 用于多个列表项的单个侦听器

Android 用于多个列表项的单个侦听器,android,onclicklistener,Android,Onclicklistener,我正在使用RecyclerView作为列表。RecyclerView的每个布局项都有一个按钮。这个按钮应该保存一些数据(我绑定到视图的数据) 我想既然每个视图项中都有相同的按钮,为什么不拥有一个静态侦听器实例,我可以绑定到所有按钮上呢。因为那样可以节省一些内存 现在,关于侦听器(View.OnClickListener())的几点意见: 它作为myRecyclerView.Adapter类的静态成员存储,并在为第一项绑定数据时实例化一次 该实例被创建为匿名实例,并位于方法内(onBindVie

我正在使用
RecyclerView
作为列表。
RecyclerView
的每个布局项都有一个
按钮
。这个按钮应该保存一些数据(我绑定到视图的数据)

我想既然每个视图项中都有相同的按钮,为什么不拥有一个静态侦听器实例,我可以绑定到所有按钮上呢。因为那样可以节省一些内存

现在,关于侦听器(
View.OnClickListener()
)的几点意见:

  • 它作为my
    RecyclerView.Adapter
    类的静态成员存储,并在为第一项绑定数据时实例化一次
  • 该实例被创建为匿名实例,并位于方法内(
    onBindViewHolder(ViewHolder,int-position)
  • 在侦听器的
    onClick(View v)
    方法中,我访问要绑定的数据。使用此方法中提供的位置(
    onBindViewHolder(ViewHolder,int-position)
    )从存储为适配器源的数据对象列表中检索此数据
现在,问题是:

当我点击按钮并检查监听器将要保存的项目时,我发现
RecyclerView
中的第一个数据条目是对应于
RecyclerView
中任何项目的点击而保存的

我不知道为什么会这样。有人能找到原因吗

其次,对于多个列表项使用一个侦听器是否是一个好策略


注意:我无法发布它的代码。很抱歉。

  • 如果您是基于
    Recyclerview
    的第一项获得响应,那么要获得实际位置,使用
    getAdapterPosition()
    ViewHolder
    类或
    onBindView()
    getTag()
    也可能有助于获得准确的数据
  • 由于
    RecyclerView
    (顾名思义)回收其子视图,因此不存在与内存相关的问题
      • 如果您是基于
        Recyclerview
        的第一项获得响应,那么要获得实际位置,使用
        getAdapterPosition()
        ViewHolder
        类或
        onBindView()
        getTag()
        也可能有助于获得准确的数据
      • 由于
        RecyclerView
        (顾名思义)回收其子视图,因此不存在与内存相关的问题
        处理RecyclerView点击的最佳方法如下:

        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = layoutInflater.inflate(R.layout.list_item, parent, false);
            final ViewHolder viewHolder = new ViewHolder(view);
        
            viewHolder.actionButton.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    int itemPosition = viewHolder.getAdapterPosition();
                    handleActionButtonClick(itemPosition);
                }
            });
        
            return viewHolder;
        }
        

        它简单而健壮。对所有项目使用单击侦听器是过度优化的一个极端例子。这几个额外的字节不会有任何影响,它会带来额外样板文件的成本。

        处理RecyclerView点击的最佳方法如下:

        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = layoutInflater.inflate(R.layout.list_item, parent, false);
            final ViewHolder viewHolder = new ViewHolder(view);
        
            viewHolder.actionButton.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    int itemPosition = viewHolder.getAdapterPosition();
                    handleActionButtonClick(itemPosition);
                }
            });
        
            return viewHolder;
        }
        

        它简单而健壮。对所有项目使用单击侦听器是过度优化的一个极端例子。这几个额外的字节将永远不会有问题,它将带来额外样板的成本。

        可能导致问题的位置要么声明为最终,要么使用按钮视图的setTag/getTag在onClick方法中获得正确的位置,使用
        v
        可能导致问题的位置要么声明为最终,要么使用按钮视图的setTag/getTag获得正确的位置使用
        v
        在onClick方法中获得正确的位置是的,事实上似乎是……我在发布问题后不久就遵循了你的方法,因为问题变得越来越复杂,没有任何回报。谢谢你的回答。是的,确实是这样……我在发布了这个问题后不久就遵循了你的方法,因为问题变得越来越复杂,没有任何回报。谢谢你的回答。