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