【问题标题】:How to add Onclick listener to recycler view如何将 Onclick 侦听器添加到回收站视图
【发布时间】:2017-05-24 07:40:29
【问题描述】:

我正在开发一个简单的记事本应用程序,首先我使用 listView 来显示所有笔记。但现在我使用的是 RecyclerView。当我使用列表视图时,我使用 OnItemClickListener 将数据传递给另一个活动以编辑注释 现在我很困惑在 Recylerview 中做什么

对于 listView 我正在使用这个

 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            name = filenames.get(position).getName();
            note = filenames.get(position).getShorttext();
            Alert(); // this method is in main activity 

        }
    });*/  


  public void Alert()
   {
    final AlertDialog dialog;
    View mview = getLayoutInflater().inflate(R.layout.dialog_pass,null);
    final EditText mEdittext = (EditText) mview.findViewById(R.id.Epass);
    AlertDialog.Builder mBuilder = new AlertDialog.Builder(MainActivity.this);
    mBuilder.setView(mview);
    mBuilder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            String col = mEdittext.getText().toString();
            String password = dBhelper.searchpass(col);
            if (col.equals(password)) {
                Intent intent =  new Intent(MainActivity.this,Note2.class);
                intent.putExtra("Name",name);
                intent.putExtra("Note",note);
                startActivity(intent);
            } else {
                Toast temp = Toast.makeText(MainActivity.this, "Password does not match", Toast.LENGTH_SHORT);
                temp.show();
            }

        }
    });
    mBuilder.setNegativeButton("Cancel",null);
    mBuilder.setCancelable(false);
    dialog = mBuilder.create();
    dialog.show();

     }

现在我应该为回收视图做什么,请帮助

  public class RecycleViewAdapter extends 
  RecyclerView.Adapter<RecycleViewHolder> {// Recyclerview will extend to
  private List<FileName> fileNames;
  private Context context;

  public RecycleViewAdapter(Context context,List<FileName> fileNames) {
    this.context = context;
    this.fileNames = fileNames;

}

@Override
public RecycleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    LayoutInflater mInflater = LayoutInflater.from(parent.getContext());

    ViewGroup mainGroup = (ViewGroup) mInflater.inflate(
            R.layout.grid_item, parent, false);
    RecycleViewHolder listHolder = new RecycleViewHolder(mainGroup);
    return listHolder;

}

@Override
public void onBindViewHolder(RecycleViewHolder holder, final int position) {
    final FileName model = fileNames.get(position);
    RecycleViewHolder mainHolder = (RecycleViewHolder) holder;// holder
    mainHolder.title.setText(model.getName());
    mainHolder.note.setText(model.getShorttext());

}

@Override
public int getItemCount() {
    return (null != fileNames ? fileNames.size() : 0);
  }

【问题讨论】:

标签: android android-recyclerview


【解决方案1】:

您可以使用两种方式处理此问题

1)。手势触摸 https://www.google.co.in/amp/sapandiwakar.in/recycler-view-item-click-handler/amp/

2).在适配器中使用接口 https://antonioleiva.com/recyclerview-listener/

我建议使用接口的第二种方式

recycleritemclick如何使用界面

public class RecycleViewAdapter extends 
  RecyclerView.Adapter<RecycleViewHolder> {// Recyclerview will extend to
  private List<FileName> fileNames;
  private Context context;

//declare interface 
  private OnItemClicked onClick;

//make interface like this
  public interface OnItemClicked {
        void onItemClick(int position);
  }

  public RecycleViewAdapter(Context context,List<FileName> fileNames) {
    this.context = context;
    this.fileNames = fileNames;
  }

现在将点击分配给界面

@Override
public void onBindViewHolder(RecycleViewHolder holder, final int position) {
  //............//
  holder.title.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
        onClick.onItemClick(position);
     }
  });
}

在适配器类的末尾,从完成括号开始,创建一种方法将 itemclick 分配给接口

public void setOnClick(OnItemClicked onClick){
    this.onClick=onClick;
}

在 MainActivity.java 用适配器绑定item点击

public class MainActivity extends Activity implements OnItemClicked {
 
    private RecyclerView mRecyclerView;
    private CityAdapter mAdapter;
    private List<City> cities;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_city);

        mRecyclerView = (RecyclerView)findViewById(R.id.list);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        
        mAdapter = new CityAdapter(cities, R.layout.row_city, this);
        mRecyclerView.setAdapter(mAdapter);
 
        mAdapter.setOnClick(MainActivity.this); // Bind the listener
    }
 
    @Override
    public void onItemClick(int position) {
    // The onClick implementation of the RecyclerView item click
    //ur intent code here
    }
}

Kotlin 代码请参考How to handle recyclerview item click in kotlin?

更多查询?评论。

【讨论】:

  • 我想通过 Intent 传递数据 OnClick 它不起作用:(
  • 你已经创建界面了吗?
  • 不应该在界面中写什么代码请帮助我是android新手
  • public class MainActivity extends Activity implements RecycleViewAdapter.OnItemClicked //请确保你在MainActivity上实现了适配器接口
  • 非常感谢你救了我的命 :) 上帝保佑你
【解决方案2】:

最简单的解决方案是访问持有者类的“itemView”公共变量并在其上设置onClickListener。

@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(context, NewActivity.class);
                intent.putExtra("FileName", list.get(position));
                context.startActivity(intent);
            }
        });        
}

【讨论】:

    【解决方案3】:

    把你的适配器改成这个

        public class RecycleViewAdapter extends
            RecyclerView.Adapter<RecycleViewHolder> {// Recyclerview will extend to
        private List<FileName> fileNames;
        private Context context;
        private OnItemClicked listener;
    
        public RecycleViewAdapter(Context context, List<FileName> fileNames, OnItemClicked  listener) {
            this.context = context;
            this.fileNames = fileNames;
            this.listener = listener;
        }
    
        public BookingHistoryFragment() {
            // Required empty public constructor
        }
    
        @Override
        public RecycleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            LayoutInflater mInflater = LayoutInflater.from(parent.getContext());
    
            ViewGroup mainGroup = (ViewGroup) mInflater.inflate(
                    R.layout.grid_item, parent, false);
            RecycleViewHolder listHolder = new RecycleViewHolder(mainGroup);
    
            return listHolder;
    
        }
    
        @Override
        public void onBindViewHolder(RecycleViewHolder holder, final int position) {
            final FileName model = fileNames.get(position);
            RecycleViewHolder mainHolder = (RecycleViewHolder) holder;// holder
            mainHolder.title.setText(model.getName());
            mainHolder.note.setText(model.getShorttext());
    
            // Add click listener for root view
            view.getRootView().setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                listener.onItemClick(view, position)
            }
            });
        }
    
        @Override
        public int getItemCount() {
            return (null != fileNames ? fileNames.size() : 0);
        }
    
        public interface OnItemClicked {
            void onItemClick(View view, int position);
        }
    }
    

    现在在从活动或片段初始化时将 ItemClickInterface 传递给适配器构造函数。 而不是:

    RecycleViewAdapter adapter = new RecycleViewAdapter(this, filenames);
    

    使用这个:

    RecycleViewAdapter adapter = new RecycleViewAdapter(this, filenames, new RecycleViewAdapter.OnItemClicked () {
    @Override
          public void onItemClick(View view, Position position) {
    
          }
    });
    

    【讨论】:

      【解决方案4】:

      首先将这个类添加到你的包中

      public class MyTouchListener implements RecyclerView.OnItemTouchListener {
      
      
      /*Change these as per your need*/
      private static final int SWIPE_MIN_DISTANCE = 120;
      private static final int SWIPE_THRESHOLD_VELOCITY = 200;
      private static final int SWIPE_MAX_OFF_PATH = 250;
      
      private OnTouchActionListener mOnTouchActionListener;
      private GestureDetectorCompat mGestureDetector;
      
      public static interface OnTouchActionListener {
          public void onLeftSwipe(View view, int position);
          public void onRightSwipe(View view, int position);
          public void onClick(View view, int position);
      }
      
      public MyTouchListener(Context context, final RecyclerView recyclerView,
                                   OnTouchActionListener onTouchActionListener){
      
          mOnTouchActionListener = onTouchActionListener;
          mGestureDetector = new GestureDetectorCompat(context,new GestureDetector.SimpleOnGestureListener(){
      
              @Override
              public boolean onSingleTapConfirmed(MotionEvent e) {
                  // Find the item view that was swiped based on the coordinates
                  View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
                  int childPosition = recyclerView.getChildPosition(child);
                  mOnTouchActionListener.onClick(child, childPosition);
                  return false;
              }
      
              @Override
              public boolean onFling(MotionEvent e1, MotionEvent e2,
                                     float velocityX, float velocityY) {
      
                  try {
                      if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) {
                          return false;
                      }
      
                      // Find the item view that was swiped based on the coordinates
                      View child = recyclerView.findChildViewUnder(e1.getX(), e1.getY());
                      int childPosition = recyclerView.getChildPosition(child);
      
                      // right to left swipe
                      if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
      
                          if (mOnTouchActionListener != null && child != null) {
                              mOnTouchActionListener.onLeftSwipe(child, childPosition);
                          }
      
                      } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                          if (mOnTouchActionListener != null && child != null) {
                              mOnTouchActionListener.onRightSwipe(child, childPosition);
                          }
                      }
                  } catch (Exception e) {
                      // nothing
                  }
      
                  return false;
              }
          });
      }
      
      @Override
      public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
          mGestureDetector.onTouchEvent(e);
          return false;
      }
      
      @Override
      public void onTouchEvent(RecyclerView rv, MotionEvent e) {
      }
      
      @Override
      public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
          // do nothing
      }}
      

      然后像这样添加OnItemTouchListener:

      myRecyclerView.addOnItemTouchListener(new MyTouchListener(mContext,
                  myRecyclerView,
                  new MyTouchListener.OnTouchActionListener() {
                      @Override
                      public void onLeftSwipe(View view, int position) {//code as per your need
                      }
      
                      @Override
                      public void onRightSwipe(View view, int position) {//code as per your need
                      }
      
                      @Override
                      public void onClick(View view, int position) {//code as per your need
                      }
                  }));
      

      【讨论】:

        【解决方案5】:

        在您的适配器类上创建一个接口。

        public interface SelectedUser{
        
            void selectedUser(UserModel userModel);
        
        }
        

        在您的适配器视图持有者类中监听点击事件。

                itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        selectedUser.selectedUser(userModelList.get(getAdapterPosition()));
                    }
                });
        

        最终在您的活动中实现您的接口并覆盖该方法。

           @Override
            public void selectedUser(UserModel userModel) {
        
                startActivity(new Intent(MainActivity.this, SelectedUserActivity.class).putExtra("data",userModel));
        
        
        
            }
        

        完整教程和源代码使用下面的链接。 Recyclerview with click listener

        【讨论】:

          【解决方案6】:

          将此代码添加到您的 RecyclerView 适配器中

              private OnItemClicked mListener;
          
              public RecycleViewAdapter(Context context, OnItemClicked listener, List<FileName> fileNames) {
                  //............//
                  this.mListener = listener;
              }
          
              @Override
              public void onBindViewHolder(RecycleViewHolder holder, final int position) {
                  //............//
                  mainHolder.title.setOnClickListener(new View.OnClickListener() {
                      @Override
                      public void onClick(View v) {
                          mListener.onItemClick(position);
                      }
                  });
          
              }
          
              public interface OnItemClicked {
                  void onItemClick(int position);
              }
          

          并将您的 Activity/Fragment 实现为 RecyclerViewAdapter.OnItemClicked

          要通过 Intent,您可以在 Activity/Fragment 中编写以下代码

              @Override
              public void onItemClick(int position) {
                  Intent intent = new Intent(mContext, YourActivity.class);
                  intent.putExtra(YourActivity.ARG_FILE, filnames.get(position));
                  startActivity(intent);
              }
          

          【讨论】:

          • 但我想将数据传递给另一个活动?我该怎么做?
          • 当我尝试将 Intent 放在适配器上时,它给了我一个错误
          • 已编辑答案,您能说明 Intent 错误吗?也许你在通过意图传递价值方面有错误的实现。
          • 在 OnItemClicked 上显示错误 //无法解析符号
          • 请查看界面使用方法
          【解决方案7】:

          所以,不确定是否有人感兴趣或者我的方法是否有问题,但我想出了一个更简单的方法供我自己使用。

          物品的Xml:

          <?xml version="1.0" encoding="utf-8"?>
          <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="?android:attr/listPreferredItemHeightLarge"
              android:background="@drawable/recycborder">
          
          
              <TextView
                  android:id="@+id/recycText"
                  android:layout_width="match_parent"
                  android:layout_height="match_parent"
                  android:gravity="center_vertical|center"
                  android:onClick="recycClick"
                  android:textColor="@color/black"
                  android:textSize="16sp" />
          
          </RelativeLayout>
          

          在 onBindViewHolder 内部,将标签设置为您需要的任何信息。名称、位置、显示的文字、显示的图片等等。

          @Override
              public void onBindViewHolder(ViewHolder holder, final int position) {
                  holder.recycText.setText(lstAllInfo.get(position));
                  holder.recycText.setTag(lstAllInfo.get(position));
          
              }
          

          在您要处理项目的方法中单击:

           public void recycClick(View v) {
                  String test = v.getTag().toString();
                  Toast.makeText(getApplicationContext(), ("You clicked: "  + test), Toast.LENGTH_LONG).show();
              }
          

          我认为这是有限制的。标签可能无法保存您需要的数据,或者回收视图可能无法访问正确的点击活动。我个人将它用于 Android Wear 并且效果很好,所以我想我会发布以防万一,因为它的工作量比其他方法少得多。

          【讨论】:

            【解决方案8】:

            在您的持有人类中尝试此代码.... 它将工作且易于使用:

            public class RecyclerViewHolder extends RecyclerView.ViewHolder {
            
                    public ItemHolder(@NonNull final View recyclerView) {
                        super(recyclerView)
            
                        recyclerView.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View view) {
                                int position = getAdapterPosition();
            
                            }
                        });
                    }
                }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-03-08
              • 1970-01-01
              • 2016-12-17
              • 2021-06-21
              • 1970-01-01
              • 2012-08-30
              • 2011-07-20
              • 1970-01-01
              相关资源
              最近更新 更多