【问题标题】:Android RecycleView OnClick does not work for whole itemViewAndroid RecyclerView OnClick 不适用于整个 itemView
【发布时间】:2016-10-17 16:10:20
【问题描述】:

所以问题是只为 imageButton 而不是 while itemView 调用 onClick。这是我的 ViewHolder 类

public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
    protected TextView title;
    protected TextView rank;
    protected ImageView image;
    protected ImageButton share;
    public ViewHolder(View itemView) {
        super(itemView);
        title =  (TextView) itemView.findViewById(R.id.main_title);
        rank = (TextView) itemView.findViewById(R.id.rank_text);
        image = (ImageView) itemView.findViewById(R.id.main_image);
        share = (ImageButton) itemView.findViewById(R.id.main_share);
        share.setOnClickListener(this);
        itemView.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        Log.d("click", "clicked at" + getAdapterPosition());
    }
}

更新:

因为我在我的 recycleview 中使用了 cardviews,所以我最终将我的 viewholder 代码更改为这个

public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
    protected TextView title;
    protected TextView rank;
    protected ImageView image;
    protected ImageButton share;
    protected CardView cardView;
    public ViewHolder(View itemView) {
        super(itemView);
        title =  (TextView) itemView.findViewById(R.id.main_title);
        rank = (TextView) itemView.findViewById(R.id.rank_text);
        image = (ImageView) itemView.findViewById(R.id.main_image);
        share = (ImageButton) itemView.findViewById(R.id.main_share);
        cardView = (CardView) itemView.findViewById(R.id.main_card_view);
        share.setOnClickListener(this);
        cardView.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        Log.d("test", "test" + getAdapterPosition());
    }
}

它有效

【问题讨论】:

标签: android


【解决方案1】:

因为我在我的回收视图中使用了卡片视图,所以我最终将我的视图持有者代码更改为这个

public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
    protected TextView title;
    protected TextView rank;
    protected ImageView image;
    protected ImageButton share;
    protected CardView cardView;
    public ViewHolder(View itemView) {
        super(itemView);
        title =  (TextView) itemView.findViewById(R.id.main_title);
        rank = (TextView) itemView.findViewById(R.id.rank_text);
        image = (ImageView) itemView.findViewById(R.id.main_image);
        share = (ImageButton) itemView.findViewById(R.id.main_share);
        cardView = (CardView) itemView.findViewById(R.id.main_card_view);
        share.setOnClickListener(this);
        cardView.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        Log.d("test", "test" + getAdapterPosition());
    }
}

`它的工作原理

【讨论】:

    【解决方案2】:

    您为itemViewshare 使用相同的点击监听器

    • 单独的视图点击正确

      @Override
      public void onClick(View view) {
          if (view.equals(share) {
              // 'share' was tapped
          }
          else {
              // 'itemView' was tapped
          }
      }
      
    • 在您的 XML 布局中(我猜是这里 :) 更改如下(即在正确的位置添加 clickable

      // this is your list cell (the item renderer)
      <RelativeLayout
          android:clickable="true"
          ...>
          <TextView 
              android:id="@+id/main_title"
              android:clickable="false"
              .../>
          <TextView 
              android:id="@+id/rank_text"
              android:clickable="false"
              .../>
          <ImageView 
              android:id="@+id/main_image"
              android:clickable="false"
              .../>
          <ImageButton 
              android:id="@+id/main_share"
              android:clickable="true"
              .../>
      </RelativeLayout>
      

    如果由于某种原因无法正常工作,请发布您的 XML 布局和您可以共享的任何其他代码。

    【讨论】:

      【解决方案3】:

      RecyclerView 不支持在整个 itemview 上使用 onClick 方法。如果要实现onClick,则需要在itemview的子视图上设置OnClickListener

      同时,RecyclerView 仅支持 itemview 上的OnTouchListeneronTouch 方法。

      【讨论】:

      【解决方案4】:

      recyclerView 中的多个 onClick 事件:

          public static class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener{
      
          public ImageView iconImageView;
          public TextView iconTextView;
      
          public MyViewHolder(final View itemView) {
              super(itemView);
      
              iconImageView = (ImageView) itemView.findViewById(R.id.myRecyclerImageView);
              iconTextView = (TextView) itemView.findViewById(R.id.myRecyclerTextView);
              // set click event
              itemView.setOnClickListener(this);
              iconTextView.setOnClickListener(this);
              // set long click event
              iconImageView.setOnLongClickListener(this);
          }
      
          // onClick Listener for view
          @Override
          public void onClick(View v) {
      
              if (v.getId() == iconTextView.getId()){
                  Toast.makeText(v.getContext(), "ITEM PRESSED = " + String.valueOf(getAdapterPosition()), Toast.LENGTH_SHORT).show();
              } else {
                  Toast.makeText(v.getContext(), "ROW PRESSED = " + String.valueOf(getAdapterPosition()), Toast.LENGTH_SHORT).show();
              }
          }
      
      
          //onLongClickListener for view
          @Override
          public boolean onLongClick(View v) {
      
              final AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext());
              builder.setTitle ("Hello Dialog")
                      .setMessage ("LONG CLICK DIALOG WINDOW FOR ICON " + String.valueOf(getAdapterPosition()))
                      .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                          @Override
                          public void onClick(DialogInterface dialog, int which) {
      
                          }
                      });
      
              builder.create().show();
              return true;
          }
      }
      

      【讨论】:

        【解决方案5】:
        公共类 ViewHolder 扩展 RecyclerView.ViewHolder 实现 View.OnClickListener{ 受保护的 TextView 标题; 受保护的 TextView 排名; 受保护的 ImageView 图像; 受保护的 ImageButton 共享; 受保护的 CardView cardView; 公共 ViewHolder(查看 itemView) { 超级(项目视图); title = (TextView) itemView.findViewById(R.id.main_title); rank = (TextView) itemView.findViewById(R.id.rank_text); image = (ImageView) itemView.findViewById(R.id.main_image); share = (ImageButton) itemView.findViewById(R.id.main_share); cardView = (CardView) itemView.findViewById(R.id.main_card_view); itemView.share.setOnClickListener(this); itemView.cardView.setOnClickListener(this); } @覆盖 公共无效 onClick(查看 v){ Log.d("test", "test" + getAdapterPosition()); } }

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-01-05
          • 2023-03-22
          • 2023-03-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多