Android 如何处理在一行RecyclerView中单击某些项目?

Android 如何处理在一行RecyclerView中单击某些项目?,android,Android,当我点击RecyclerView行中的点时,我想添加一个弹出菜单,该菜单将显示许多选项,包括(删除、更新等),并希望在适配器活动之外而不是在其内部执行该弹出菜单的逻辑。 我怎么做 这是我的适配器代码 public class JobAdapter extends RecyclerView.Adapter<JobAdapter.ViewHolder> { private List<JobModel> mData; private LayoutInflater mInfla

当我点击RecyclerView行中的点时,我想添加一个弹出菜单,该菜单将显示许多选项,包括(删除、更新等),并希望在适配器活动之外而不是在其内部执行该弹出菜单的逻辑。 我怎么做

这是我的适配器代码

public class JobAdapter extends RecyclerView.Adapter<JobAdapter.ViewHolder> {
private List<JobModel> mData;
private LayoutInflater mInflater;
private JobAdapter.ItemClickListener mClickListener;
// data is passed into the constructor
public JobAdapter(Context context, List<JobModel> mData) {
    this.mInflater = LayoutInflater.from(context);
    this.mData = mData;
}
// inflates the row layout from xml when needed
@NonNull
@Override
public JobAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = mInflater.inflate(R.layout.job_item, parent, false);
    return new JobAdapter.ViewHolder(view);
}
// binds the data to the TextView in each row
@Override
public void onBindViewHolder(final JobAdapter.ViewHolder holder, final int position) {
    holder.Name.setText(mData.get(position).getName());
    holder.HeadLine.setText(mData.get(position).getHeadLine());
    holder.Time.setText(mData.get(position).getTime());
}
// total number of rows
@Override
public int getItemCount() {
    return mData.size();
}
// stores and recycles views as they are scrolled off screen
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
    TextView Name;
    TextView HeadLine;
    TextView Time;
    View MyJobOptions;
    ViewHolder(View itemView) {
        super(itemView);
        Name = itemView.findViewById(R.id.employer_name);
        HeadLine = itemView.findViewById(R.id.head_line);
        Time = itemView.findViewById(R.id.date_of_job);
        MyJobOptions = itemView.findViewById(R.id.textViewOptions);
        // these are used when the click on the whole view not on item inside view
        itemView.setOnClickListener(this);
        itemView.setOnLongClickListener(this);
        MyJobOptions.setOnClickListener(this); // new
    }
    @Override
    public void onClick(View view) {
        if (mClickListener != null) {
            mClickListener.onItemClick(view, getAdapterPosition());
            //    mClickListener.onMyJobOptionsClick(view, getAdapterPosition()); // new
        }
    }
    @Override
    public boolean onLongClick(View view) {
        if (mClickListener != null) mClickListener.onItemLongClick(view, getAdapterPosition());
        return true;
    }
}
// convenience method for getting data at click position
JobModel getItem(int id) {
    return mData.get(id);
}
// allows clicks events to be caught
void setClickListener(JobAdapter.ItemClickListener itemClickListener) {
    this.mClickListener = itemClickListener;
}
// parent activity will implement this method to respond to click events
public interface ItemClickListener {
    void onItemClick(View view, int position);
    void onItemLongClick(View view, int position);
    //   void onMyJobOptionsClick(View view, int position); //new
}
公共类JobAdapter扩展了RecyclerView.Adapter{
私有列表数据;
私人停车场;
private JobAdapter.ItemClickListener McClickListener;
//数据被传递到构造函数中
PublicJobAdapter(上下文,列表mData){
this.mInflater=LayoutInflater.from(上下文);
this.mData=mData;
}
//根据需要从xml扩展行布局
@非空
@凌驾
public JobAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup父级,int-viewType){
视图=mInflater.flate(R.layout.job_项,父项,false);
返回新的JobAdapter.ViewHolder(视图);
}
//将数据绑定到每行的TextView
@凌驾
public void onBindViewHolder(最终JobAdapter.ViewHolder,最终int位置){
holder.Name.setText(mData.get(position.getName());
holder.HeadLine.setText(mData.get(position.getHeadLine());
holder.Time.setText(mData.get(position.getTime());
}
//总行数
@凌驾
public int getItemCount(){
返回mData.size();
}
//在屏幕外滚动视图时存储和回收视图
公共类ViewHolder扩展了RecyclerView.ViewHolder实现了View.OnClickListener、View.OnLongClickListener{
文本视图名称;
文本视图标题;
文本查看时间;
查看MyJobOptions;
ViewHolder(视图项视图){
超级(项目视图);
名称=itemView.findViewById(R.id.employer\U名称);
HeadLine=itemView.findviewbyd(R.id.head\u行);
时间=itemView.findViewById(R.id.date\u of\u job);
MyJobOptions=itemView.findViewById(R.id.textViewOptions);
//当单击整个视图而不是项目内部视图时,将使用这些选项
setOnClickListener(这个);
setOnLongClickListener(此);
MyJobOptions.setOnClickListener(此);//新建
}
@凌驾
公共void onClick(视图){
if(mClickListener!=null){
onItemClick(视图,getAdapterPosition());
//mClickListener.onmyjobOptions单击(视图,getAdapterPosition());//新建
}
}
@凌驾
仅长按公共布尔值(视图){
如果(mClickListener!=null)mClickListener.onItemLongClick(视图,getAdapterPosition());
返回true;
}
}
//在点击位置获取数据的简便方法
JobModel getItem(int id){
返回mData.get(id);
}
//允许捕获单击事件
void setClickListener(JobAdapter.ItemClickListener ItemClickListener){
this.mClickListener=itemClickListener;
}
//父活动将实现此方法以响应单击事件
公共接口项ClickListener{
void onItemClick(视图,int位置);
单击鼠标左键(视图,int位置);
//void onmyjoboptions单击(视图,int位置);//新建
}
}


提前感谢您

在类视图持有者中,如果您有一个视图,您可以使用itemView访问项目的元素。应该是这样的:

public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
YourInterface interface;
TextView Name;
TextView HeadLine;
TextView Time;
View MyJobOptions;
ViewHolder(View itemView) {
    super(itemView);
    Name = itemView.findViewById(R.id.employer_name);
    HeadLine = itemView.findViewById(R.id.head_line);
    Time = itemView.findViewById(R.id.date_of_job);
    MyJobOptions = itemView.findViewById(R.id.textViewOptions);
    // these are used when the click on the whole view not on item inside view
    itemView.setOnClickListener(this);
    itemView.setOnLongClickListener(this);
    MyJobOptions.setOnClickListener(this);


    itemView.findViewById(R.id.TheITEMTHATYOUWANTOCLICK).setOnClickListener{

     interface.yourMethod()
    }
}
活跃

class YourActivity implements YourInterface{
override void yourMethod(){
//the logic of what you want to be done
}


}
接口内

public interface YourInterface{
void yourMethod()
}

让我知道它是否适合你

我想在Adapter之外的其他活动中执行弹出菜单的代码,以便您可以实现该活动将要实现且viewholder将使用的界面。我会更新答案