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
不起作用
这是myrecyclerview的适配器
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()
在每个项目中都不起作用。