单个OnClickListener用于多个ViewHolders

时间:2016-10-10 13:14:56

标签: android

我的ViewHolder(内部)课程:

static class HostViewHolder extends RecyclerView.ViewHolder {

    ImageButton button1;
    ImageButton button2;

    HostViewHolder(View listItemView) {
        super(listItemView);

        button1 = (ImageButton) listItemView.findViewById(R.id.button1);
        button2 = (ImageButton) listItemView.findViewById(R.id.button2);
    }
}

onBindViewHolder()我通过以下方式将OnClickListener附加到Button

@Override
public void onBindViewHolder(final HostViewHolder holder, int position) {
    holder.button1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int pos = holder.getAdapterPosition();
            // doing something using the value of pos
        }
    });
    holder.button2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int pos = holder.getAdapterPosition();
            // doing some other thing using the value of pos
        }
    });
}

它工作正常,但我使用这种方法的问题是我为每个OnClickListener创建一个新的ViewHolder实例,这感觉有点多余。

我想创建一个单个 OnClickListener实例,但我无法访问position的{​​{1}}和holder参数方式。

这有可能实现吗?如果是这样,怎么样?

提前致谢。

2 个答案:

答案 0 :(得分:1)

您可以在ViewHolder类本身中附加onClickListener。

static class HostViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

    ImageButton button1;
    ImageButton button2;

    HostViewHolder(View listItemView) {
        super(listItemView);

        button1 = (ImageButton) listItemView.findViewById(R.id.button1);
        button2 = (ImageButton) listItemView.findViewById(R.id.button2);
        button1.setOnClickListener(this);
        button2.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        int position = getAdapterPosition();
        switch (v.getId()){
            //handle clicks
        }
    }
}

答案 1 :(得分:0)

是的,可以实现它,正如@Gurupad建议的那样,使用onClick(View v)方法中的switch语句。从个人经验来看,它是处理多个onClicks的最佳方式,它使您和您的团队能够轻松阅读和理解您的代码(如果与团队合作)。

有关使用带有按钮的开关语句的进一步帮助,请单击

 public void onClick(View v) {
    switch (v.getId()){
     case R.id.button1:
     //some code here
     break;
     case R.id.button2:
     //some code here
     break;
  }
}