【问题标题】:onclicklistener on the specific item of the recyclerview in androidandroid中recyclerview的特定项目上的onclicklistener
【发布时间】:2016-04-21 04:34:19
【问题描述】:

我要问一个非常基本的问题,但我被困了很长时间。

卡片查看后有一个循环视图,每行有 2 个图像。 现在我想在图像上创建点击监听器而不是recycleview。

这个activity(MainActivity.java)对应的layout(layout_main.xml)只包含recyclerview。每行的元素都在另一个布局中(layout_images.xml)。我从 layout_images.xml 获取图像并将它们膨胀到适配器类(Adapter.java)中。

现在如何只在图像上放置动作监听器。

其次,我想获取我点击的图像。如何得到。 比如,当我们点击一​​个视图时,我们会创建一些方法

public void onClick(View view){
    // some code here
}

view 是我们点击的对象。就我而言,如何获取我单击的图像。 使用类型转换可能会在用户不点击图像时引发异常。

【问题讨论】:

    标签: java android xml android-recyclerview


    【解决方案1】:

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

    要获取点击了哪个项目,您需要匹配视图 ID,即 v.getId() == yourViewItem.getId()

    【讨论】:

    • 对于v.getId() == yourViewItem.getId() 我可以解释yourViewItem as R.id.image1? 还是我必须使用findViewById() 然后使用这个变量来匹配ImageView im = (ImageVIew) findViewById(R.id.image1); im.getId() == v.getIdv.getId == R.id.image1 哪个是正确的?两者有区别吗?
    • 像 R.id.yourView 一样比较 ID,当点击事件发生时是一个整数值,我们可以通过 v.getId() 方法找到这个值。 v.getId == R.id.image1(使用这个)
    • 在适配器中,有两种方法可以直接在 onBindViewHolder(...) 中设置 onclick,例如 holder.button.setOnClickListener(new View.OnClickListener() { @覆盖 public void onClick(View v) { });或通过 MyViewHolderClass 实现项目单击侦听器(如本文所述)
    【解决方案2】:

    您必须在onBindViewHolder 方法内将onClickListener 设置为ImageViews,参考以下LOC 以供参考(代码在onBindViewHolder 方法内)

    holder.imageView1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //put your code for first imageview here
        }
    });
    holder.imageView2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //put your code for second imageView here
        }
    });
    

    【讨论】:

      【解决方案3】:

      Recycle View Holder,在里面写你的onclick监听代码

          @Override
          public void onBindViewHolder(CardHolder holder, final int position) {
             holder.imageView.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                    //TODO
                  }
              }
         }
      

      【讨论】:

        【解决方案4】:

        在您的ViewHolder 类中实现View.OnClickListener 并实现onClick 方法。然后将 ImageView 的单击侦听器设置为此单击侦听器。在 onClick 方法中添加所需的功能。如果你想在其他类中实现点击功能,只需创建一个接口并在其中声明一个点击方法。您可以在包含此 RecycleView 的活动/片段中实现此方法。然后从您的视图持有者 onClick 方法中,您可以调用接口方法。

        【讨论】:

          【解决方案5】:

          您可以像这样使用标签或其元素进行检查:

          public void onClick(View view){
          if(view.getId() == image1.getId())
          {
          
          }else if(view.getId() == image2.getId())
          {}
          
          }
          

          【讨论】:

            【解决方案6】:

            首先将 onclickListener 设置为您希望被点击的每个视图。在 viewHolderConstructor 中做这件事的好地方。例如

              public class GalleryManyViewHolder extends RecyclerView.ViewHolder {
            
                @BindView(R.id.im_img) RoundedCornersImageView imImg;
                @BindView(R.id.tv_title) MyTextView tvTitle;
                @BindView(R.id.tv_label) MyTextView tvLabel;
                @BindView(R.id.tv_date) MyTextView tvDate;
                @BindView(R.id.im_gallery_one) RoundedCornersImageView imGalleryOne;
                @BindView(R.id.im_gallery_two) RoundedCornersImageView imGalleryTwo;
                @BindView(R.id.im_gallery_three) RoundedCornersImageView imGalleryThree;
                @BindView(R.id.im_gallery_four) RoundedCornersImageView imGalleryFour;
                @BindView(R.id.tv_more) MyTextView tvMore;
                @BindView(R.id.root) RelativeLayout root;
            
                public GalleryManyViewHolder(View view) {
                  super(view);
                  ButterKnife.bind(this, view);
                  view.setOnClickListener(onClickListener);
                  imGalleryOne.setOnClickListener(onClickListener);
                  imGalleryTwo.setOnClickListener(onClickListener);
                  imGalleryThree.setOnClickListener(onClickListener);
                  imGalleryFour.setOnClickListener(onClickListener);
                  view.setTag(this);
            
                }
            

            通常你不需要对这些视图做任何特定的事情,比如设置标签(还有一些有用的库,比如 Glied,如果你设置自己的标签,它将自己的标签设置为图像视图会发生故障。在 clickListener 上找到适配器位置能够检索相应数据的视图

            View.OnClickListener onClickListener = new View.OnClickListener() {
                @Override public void onClick(View v) {
                  View view = v;
                  View parent = (View) v.getParent();
                  while (!(parent instanceof RecyclerView)){
                    view=parent;
                    parent = (View) parent.getParent();
                  }
                  int position = recyclerView.getChildAdapterPosition(view);
            }
            

            here 所述 然后检查视图 id,评估你想要做什么

            switch (v.getId()) {
                        case R.id.im_gallery_one: {
                          p = 0;
                        }
                        break;
                        case R.id.im_gallery_two: {
                          p = 1;
                        }
                        break;
                        case R.id.im_gallery_three: {
                          p = 2;
                        }
                        break;
                        case R.id.im_gallery_four: {
                          p = 3;
                        }
                        break;
                      }
            

            【讨论】:

              猜你喜欢
              • 2021-01-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多