【问题标题】:Where should I place setOnClickListener in a RecyclerView Adapter我应该将 setOnClickListener 放在 RecyclerView 适配器的哪个位置
【发布时间】:2015-04-09 11:32:20
【问题描述】:

在互联网上的教程中,他们在 RecyclerView 的适配器中设置了 OnClickListener,他们以两种方式定义它:在 ViewHolder 内部或在 BindViewHolder 内部。

我的问题是哪种方法更好,如果可以的话,请推荐其他方法

1) 在 ViewHolder 内:

public static class ViewHolder extends RecyclerView.ViewHolder {

    public ViewHolder(View itemView) {
        super(itemView);
        tvSrc = (TextView) itemView.findViewById(R.id.tvSrc);
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(v.getContext(), "inside viewholder position = " + getAdapterPosition(), Toast.LENGTH_SHORT).show();
            }
        });
    }

2) 在 BindViewHolder 内

public void onBindViewHolder(DisplayTrainsAdapter.ViewHolder viewHolder, final int position) {

    viewHolder.tvSrc.setText(mDataset.get(position).strSrc);
    viewHolder.tvSrc.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Toast.makeText(v.getContext(), "position = " + getItemId(position), Toast.LENGTH_SHORT).show();
        }
    });
}    

【问题讨论】:

  • 让你的自定义 ViewHolder 实现 View.OnClickListener,这样你就不需要 ViewHolder 中的自定义 View.OnClickListener 类

标签: android android-viewholder android-recyclerview


【解决方案1】:

您的第一个解决方案是您建议的最佳解决方案,因为在 notify..() 方法触发的每次无效时,不会在绑定中调用该分配。 我也知道其他解决方案,但您需要在您的活动中实现 android.view.GestureDetector。

如果您想对适配器进行其他改进,请查看我的 FlexibleAdapter https://github.com/davideas/FlexibleAdapter 并随时在您的项目中实施。

【讨论】:

    【解决方案2】:

    这两种选择各有利弊。

    例如,如果单击了一个按钮,并且您想更改按钮的文本,那么您可能应该使用在 ViewHolder 中设置 onClick 侦听器的选项。除了这个原因,它还让你的代码看起来更干净。

    但是,如果说,当单击按钮时,您希望将 TextView 的文本更改为与单击的按钮相同的索引/位置,则需要使用设置 onClick 侦听器的选项onBindViewHolder 方法。

    【讨论】:

    • 这没有任何意义,两种情况你都可以做
    【解决方案3】:

    恕我直言:我喜欢 1 号。

    自从您致电new ViewHolder(View) 以来,您在实际显示您的内容之前确实设置了您的 onClickListener。这很好,因为在调用 onBindView 时,您的 onClickListener 已经设置在您的视图上。

    我认为在构造函数 ViewHolder(View) 中执行此操作的代码也更简洁

    【讨论】:

      【解决方案4】:

      我猜在ViewHolder() 中,因为您定义了view 所持有的内容以及它的内部和其他功能。

      但是onBindViewHolder()你说view,在ViewHolder中定义,会有这个文字,这个图片...

      【讨论】:

        【解决方案5】:

        您应始终检查 getAdapterPosition 是否 >= 0,因为在极少数情况下它可能为 -1 (NO_POSITION),这会导致您的应用崩溃。 https://developer.android.com/reference/android/support/v7/widget/RecyclerView.ViewHolder#getadapterposition

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-07-16
          • 2012-06-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多