Android 片段中的RecyclerView不接受OnClick

Android 片段中的RecyclerView不接受OnClick,android,android-fragments,android-recyclerview,Android,Android Fragments,Android Recyclerview,在我的main活动中有一个fragment类,它包含一个recyclerview。我想调用函数的onClickItem类型,以便播放列表中点击的歌曲名称。但是我的onClick不起作用 这是myrecyclerview的适配器 public class NowPlayingAdapter extends RecyclerView.Adapter<NowPlayingAdapter.PlayViewHolder> { ArrayList<Audio> list = ne

在我的
main活动中有一个
fragment
类,它包含一个
recyclerview
。我想调用函数的
onClickItem
类型,以便播放列表中点击的歌曲名称。但是我的
onClick
不起作用

这是my
recyclerview的
适配器

public class NowPlayingAdapter extends RecyclerView.Adapter<NowPlayingAdapter.PlayViewHolder> {

ArrayList<Audio> list = new ArrayList<>();
Context context;
private static final String TAG = "operation";

public interface NowPlayingInterface {
    void onSongClick(int position);
}

public NowPlayingInterface nowPlayingInterface;

public NowPlayingAdapter(ArrayList<Audio> list, Context context) {
    this.list = list;
    this.context = context;
    if(context instanceof NowPlayingAdapter.NowPlayingInterface){
        nowPlayingInterface = (NowPlayingInterface) context;
    }
}

@Override
public NowPlayingAdapter.PlayViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());
    View v  = inflater.inflate(R.layout.play_list_item,parent,false);
    PlayViewHolder holder = new PlayViewHolder(v);
    return holder;
}

@Override
public void onBindViewHolder(NowPlayingAdapter.PlayViewHolder holder, int position) {
    final int pos = position;
    holder.songName.setText(list.get(position).getTitle());
    holder.duration.setText(list.get(position).getDuration());
    holder.album.setText(list.get(position).getAlbum());
    holder.removeItem.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Audio item = HomeFragment.audioList.get(pos);
            HomeFragment.audioList.remove(item);
            Log.e(TAG, "Remove: " );
            HomeFragment.nowPlayingAdapter.notifyDataSetChanged();
            Log.e(TAG, "Change: " );


        }
    });
}

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

public class PlayViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
    TextView songName, album, duration;
    ImageButton removeItem;
    RelativeLayout layout;

    public PlayViewHolder(View itemView) {
        super(itemView);
        layout = (RelativeLayout) itemView.findViewById(R.id.play_list_item);
        songName = (TextView) itemView.findViewById(R.id.songname);
        album = (TextView) itemView.findViewById(R.id.album);
        duration = (TextView) itemView.findViewById(R.id.duration);
        removeItem = (ImageButton) itemView.findViewById(R.id.remove_item_button);
    }

    @Override
    public void onClick(View v) {
        if(v==layout && nowPlayingInterface!=null)
        nowPlayingInterface.onSongClick(getAdapterPosition());
    }
}
} 

在适配器中的单击侦听器中,使用类似于nowPlayingInterface的内容。onSongClick(position)这样,您的片段将能够处理单击事件并开始播放歌曲(希望如此)。

在适配器中的单击侦听器中,使用类似于nowPlayingInterface的内容。onSongClick(position)通过这种方式,您的片段将能够处理单击事件并开始播放歌曲(希望如此)。

要获得onBindViewHolder()中的位置,请设置itemView的位置标签

holder.itemView.setTag(position);
然后,您可以使用

int index = (int) view.getTag();
希望这有帮助


快乐编码

要获取onBindViewHolder()中的位置,请设置itemView的位置标签

holder.itemView.setTag(position);
然后,您可以使用

int index = (int) view.getTag();
希望这有帮助


快乐编码

你可以考虑在你的VistHoover

中添加StEngCLIKListNER方法。
public class PlayViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
TextView songName, album, duration;
ImageButton removeItem;
RelativeLayout layout;

public PlayViewHolder(View itemView) {
    super(itemView);
    layout = (RelativeLayout) itemView.findViewById(R.id.play_list_item);
    songName = (TextView) itemView.findViewById(R.id.songname);
    album = (TextView) itemView.findViewById(R.id.album);
    duration = (TextView) itemView.findViewById(R.id.duration);
    removeItem = (ImageButton) itemView.findViewById(R.id.remove_item_button);
    //Setup for which view the onclick should be called
    layout.setOnClickListener(this);
}

@Override
public void onClick(View v) {
    //since only 1 view has been setup for listening, no need of checking it's id
    if(nowPlayingInterface!=null)
    nowPlayingInterface.onSongClick(getAdapterPosition());
}
在这个视图持有者的onClick中,您可以调用
nowPlayingInterface.onSingleClick()

这里有更多关于接口的信息

额外- 我不知道您需要RelativeLayout对象的确切位置,但如果它仅用于检测项目中的点击,那么您可以将其删除,只需使用
itemView.setOnClickListener(此)


另一个建议,如果<代码> ITEMVIEW (或<代码>布局>代码>)是您在VEEWHOLD中设置OnCutle的唯一视图,您可以避免对它的ID进行检查。

< P>可以考虑在VeWHOOLD

中添加StEngCLIKListNER方法。
public class PlayViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
TextView songName, album, duration;
ImageButton removeItem;
RelativeLayout layout;

public PlayViewHolder(View itemView) {
    super(itemView);
    layout = (RelativeLayout) itemView.findViewById(R.id.play_list_item);
    songName = (TextView) itemView.findViewById(R.id.songname);
    album = (TextView) itemView.findViewById(R.id.album);
    duration = (TextView) itemView.findViewById(R.id.duration);
    removeItem = (ImageButton) itemView.findViewById(R.id.remove_item_button);
    //Setup for which view the onclick should be called
    layout.setOnClickListener(this);
}

@Override
public void onClick(View v) {
    //since only 1 view has been setup for listening, no need of checking it's id
    if(nowPlayingInterface!=null)
    nowPlayingInterface.onSongClick(getAdapterPosition());
}
在这个视图持有者的onClick中,您可以调用
nowPlayingInterface.onSingleClick()

这里有更多关于接口的信息

额外- 我不知道您需要RelativeLayout对象的确切位置,但如果它仅用于检测项目中的点击,那么您可以将其删除,只需使用
itemView.setOnClickListener(此)


另一个建议是,如果
itemView
(或
layout
)是您在Viewholder中为onClick设置的唯一视图,则可以避免检查其id。

您可能希望将onClickListener设置为侦听单击事件

 public PlayViewHolder(View itemView) {
    super(itemView);
    layout = (RelativeLayout) itemView.findViewById(R.id.play_list_item);
    songName = (TextView) itemView.findViewById(R.id.songname);
    album = (TextView) itemView.findViewById(R.id.album);
    duration = (TextView) itemView.findViewById(R.id.duration);
    removeItem = (ImageButton) itemView.findViewById(R.id.remove_item_button);
    itemView.setOnClickListener(this);
}

您可能希望将onClickListener设置为侦听单击事件

 public PlayViewHolder(View itemView) {
    super(itemView);
    layout = (RelativeLayout) itemView.findViewById(R.id.play_list_item);
    songName = (TextView) itemView.findViewById(R.id.songname);
    album = (TextView) itemView.findViewById(R.id.album);
    duration = (TextView) itemView.findViewById(R.id.duration);
    removeItem = (ImageButton) itemView.findViewById(R.id.remove_item_button);
    itemView.setOnClickListener(this);
}

getAdapterPosition()做了一件完全不同的事情。在这里,您可以查看此方法的文档-然后,我应该如何获取点击项目的位置?在onBindViewHolder()中,第三个参数是项目的位置。我无法从onBindViewHolder存储位置,并且我不知道如何使用
nowPlayingInterface.onSongClick(位置)
当我简单地将此函数放在onBindViewHolder()中时,它会抛出一个空指针,但etAdapterPosition()的作用完全不同。在这里,您可以查看此方法的文档-然后,我应该如何获取点击项目的位置?在onBindViewHolder()中,第三个参数是项目的位置。我无法从onBindViewHolder存储位置,并且我不知道如何使用
nowPlayingInterface.onSongClick(位置)
当我简单地将此函数放在onBindViewHolder()中时,它会抛出一个空指针ExceptionTanks以获取帮助,但它仍然处于相同的状态。我找到了一种方法,可以使用
gesturedector
itemView
()的尺寸来点击项目,但是现在我的按钮
onClick()
在每个项目中都不起作用。感谢您的帮助,但它仍然处于相同的状态。我找到了一种方法,可以使用
gesturedector
itemView
()的尺寸来点击项目,但是现在我的按钮的
onClick()
在每个项目中都不起作用。