Android 通过长时间单击选择recyclerview项

Android 通过长时间单击选择recyclerview项,android,android-recyclerview,Android,Android Recyclerview,我知道有很多话题都在谈论这个话题,但我看不出他们谈论得很恰当。我有一个recyclerview,当用户点击它时,它会播放曲目。我想实现一个功能,通过长时间单击,选择操作将取代播放操作,甚至在项目的一侧显示复选框 这种实现几乎存在于每个应用程序中,而且似乎很容易实现。但在其他主题中,他们只讨论如何选择和取消选择项目,问题是,这一部分很容易。 但是,当长时间单击一个项目时,如何用选择操作替换现有操作呢 我的适配器: private Context context; private ArrayList

我知道有很多话题都在谈论这个话题,但我看不出他们谈论得很恰当。我有一个recyclerview,当用户点击它时,它会播放曲目。我想实现一个功能,通过长时间单击,选择操作将取代播放操作,甚至在项目的一侧显示复选框

这种实现几乎存在于每个应用程序中,而且似乎很容易实现。但在其他主题中,他们只讨论如何选择和取消选择项目,问题是,这一部分很容易。 但是,当长时间单击一个项目时,如何用选择操作替换现有操作呢

我的适配器:

private Context context;
private ArrayList<MusicSample> collection;
private Uri playing;
private Uri chosen;
private OnMusicChange mListener;

public MusicAdapter(Context context, ArrayList<MusicSample> collection, OnMusicChange mListener){
    this.context = context;
    this.collection = collection;
    this.mListener = mListener;
}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View view = layoutInflater.inflate(R.layout.rv_song_item,parent,false);
    final ViewHolder viewHolder = new ViewHolder(view);
    viewHolder.relativeLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            MusicSample currentMusic = collection.get(viewHolder.getAdapterPosition());
            chosen = currentMusic.getLocation();
            mListener.enable(true);
            MusicController.Controller(context,mListener,currentMusic,collection);
        }
    });
    return viewHolder;
}

@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, final int position) {
            holder.title.setText(collection.get(position).getTitle());
            holder.singer.setText(collection.get(position).getSinger());
            holder.coverArt.setImageBitmap(collection.get(position).getCoverArt());
}

@Override
public int getItemCount() {
    return collection.size();
}

public class ViewHolder extends RecyclerView.ViewHolder{

    public ImageView coverArt;
    public TextView title;
    public TextView singer;
    public RelativeLayout relativeLayout;

    public ViewHolder(@NonNull View itemView) {
        super(itemView);
        coverArt = itemView.findViewById(R.id.cover_art);
        title = itemView.findViewById(R.id.tv_title);
        singer = itemView.findViewById(R.id.tv_singer);
        relativeLayout = itemView.findViewById(R.id.rv_layout);
    }

}
私有上下文;
私人收藏;
私人Uri播放;
选择私有Uri;
私人音乐更改管理员;
公共音乐播放器(上下文、ArrayList集合、OnMusicChange mListener){
this.context=上下文;
this.collection=collection;
this.mListener=mListener;
}
@非空
@凌驾
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType){
LayoutInflater LayoutInflater=(LayoutInflater)context.getSystemService(context.LAYOUT\u INFLATER\u SERVICE);
视图=布局更平坦。充气(R.layout.rv\u song\u项目,父项,false);
最终视窗夹持器视窗夹持器=新视窗夹持器(视图);

viewHolder.relativeLayout.setOnClickListener(新视图.OnClickListener(){ @凌驾 公共void onClick(视图v){ MusicSample currentMusic=collection.get(viewHolder.getAdapterPosition()); selected=currentMusic.getLocation(); mListener.enable(true); 控制器(上下文、mListener、当前音乐、收藏); } }); 返回视图持有者; } @凌驾 public void onBindViewHolder(@NonNull final ViewHolder,final int position){ holder.title.setText(collection.get(position.getTitle()); holder.singer.setText(collection.get(position.getSinger()); setImageBitmap(collection.get(position.getCoverArt()); } @凌驾 public int getItemCount(){ 返回collection.size(); } 公共类ViewHolder扩展了RecyclerView.ViewHolder{ 公共图像视图覆盖件; 公共文本视图标题; 公共文本视图歌手; 公共关系; 公共视图持有者(@NonNull View itemView){ 超级(项目视图); coverArt=itemView.findviewbyd(R.id.cover\u art); title=itemView.findviewbyd(R.id.tv\u title); singer=itemView.findViewById(R.id.tv\u singer); relativeLayout=itemView.findViewById(R.id.rv_布局); } }
您可以使用此

  holder.relativeLayout.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View view) {
            //WRITE YOUR CODE HERE
            Toast.makeText(MainActivity.this, "LONG CLICK", Toast.LENGTH_SHORT).show();
            return true;
        }
    });  
在您的
onBindViewHolder
方法中使用此选项,然后删除下面的代码表单
onCreateViewHolder
,然后重试

   viewHolder.relativeLayout.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        MusicSample currentMusic = collection.get(viewHolder.getAdapterPosition());
        chosen = currentMusic.getLocation();
        mListener.enable(true);
        MusicController.Controller(context,mListener,currentMusic,collection);
    }
});

您可以将代码添加到适配器:

 holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
    @Override
    public boolean onLongClick(View view) {
        Toast.makeText(MainActivity.this, "click item", Toast.LENGTH_SHORT).show();
        return true;
    }
});

它是如何取代主功能的?我在我的应用程序中没有收到你的问题,比如说,默认情况下,当你点击这个项目时,它会播放一首歌。我的问题是,当用户持有一个项目时,如何用选择替换播放功能。您可以共享RecyclerView适配器类吗?我已经编辑了一次代码检查,这可能对你有用。嘿@Paya,请用你的代码解释你的查询code@piyushpk我将添加我的代码,但这与我无关。我添加的代码表示,每当单击某个项目时,就会开始播放曲目。这就是我在onCreateViewHolder上写的。但是当项目长时间单击时,它应该会更改,对吗?我更新了我的问题。我认为由于MediaController/MusicController,您无法访问预定义的设置OnLongClickListener,因此您必须实现“View.OnLongClickListener”在MusicController中手动管理ViewHolder.relativeLayout.setOnLongClickListner,否则代码将保持不变,并在onBindViewHolder方法中实现。