多个列表项的单个侦听器

时间:2017-06-20 07:35:29

标签: android onclicklistener

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

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

现在,关于听众(View.OnClickListener())的一些观点:

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

现在,问题

当我点击按钮并检查听众将保存哪个项目时,我发现RecyclerView中的第一个数据条目是与任何项目的点击相对应保存的数据条目RecyclerView

我不知道为什么会这样。任何人都可以找到它的原因吗?

其次,这是一个为多个列表项设置单个侦听器的好策略吗?

注意: 我无法发布代码。对此感到抱歉。

2 个答案:

答案 0 :(得分:0)

  • 如果您根据Recyclerview的第一项获得回复,那么要在getAdapterPosition()班级或ViewHolder和{{onBindView()使用getTag()来获取实际位置1}}也可以帮助获取确切的数据
  • 由于RecyclerView(顾名思义)会回收其子视图,因此没有与内存相关的问题。

答案 1 :(得分:0)

处理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;
}

简单而强大。拥有所有项目的单击侦听器是过度优化的极端示例。这几个额外的字节永远不会重要,而且需要额外的样板费用。