Java RecyclerView内部片段不可单击

Java RecyclerView内部片段不可单击,java,android,android-recyclerview,adapter,Java,Android,Android Recyclerview,Adapter,我正在编写一个音乐播放器应用程序,但由于某种原因,片段中的RecyclerView(连接到我主要活动中的选项卡布局)出现问题,RecyclerView无法单击,当我按下某个项目时,应用程序刚好关闭。 你能帮我吗? 我添加了片段类和适配器类 公共类MusicAdapter扩展了RecyclerView.Adapter{ 私人列表歌曲; 公共资源; 语境; 公共音乐播放器(上下文,列表歌曲){ String s=String.valueOf(R.drawable.lionkingposter); 歌

我正在编写一个音乐播放器应用程序,但由于某种原因,片段中的RecyclerView(连接到我主要活动中的选项卡布局)出现问题,RecyclerView无法单击,当我按下某个项目时,应用程序刚好关闭。 你能帮我吗? 我添加了片段类和适配器类

公共类MusicAdapter扩展了RecyclerView.Adapter{ 私人列表歌曲; 公共资源; 语境; 公共音乐播放器(上下文,列表歌曲){ String s=String.valueOf(R.drawable.lionkingposter); 歌曲。添加(新音乐(“JGGUG”、“生命之圈”、“阿尔顿约翰”、“狮子王”); // } this.songs=songs;//构造函数 this.context=context; } 接口音乐播放器{ 单击音乐时无效(int位置,视图); //无效(内部位置); } 音乐倾听者; 公共无效设置侦听器(MusicListener侦听器){ this.listener=listener; } @凌驾 public MusicviewHolder onCreateViewHolder(ViewGroup父级,int-viewType){//函数设计单元格 View=LayoutInflater.from(parent.getContext()).flate(R.layout.cell,parent,false); MusicView文件夹MusicView文件夹=新的MusicView文件夹(视图); 返回音乐文件夹; } @凌驾 public void onBindViewHolder(MusicviewHolder holder,int position){//此函数获取对象并将其放入单元格中 音乐=歌曲。获取(位置); if(music.getPhoto()!=null){ 试一试{ holder.songImg.setImageResource(Integer.parseInt(music.getPhoto()); }捕获(例外e){ //holder.songImg.setImageURI(Uri.parse(music.getPhoto()); 字节[]decodedString=Base64.decode(music.getPhoto(),Base64.DEFAULT); 位图decodedByte=BitmapFactory.decodeByteArray(decodedString,0,decodedString.length); holder.songImg.setImageBitmap(解码字节); } }否则{ holder.songImg.setImageResource(0); } holder.songName.setText(music.getTitle()); holder.movieName.setText(music.getAlbum()); holder.itemView.setOnClickListener(新视图.OnClickListener(){ @凌驾 公共void onClick(视图v){ //意向意向=新意向(上下文,MediaPlayer.class); //意图。putExtra(“歌曲”,位置); //背景。开始触觉(意图); Toast.makeText(上下文“hello”,Toast.LENGTH\u SHORT); } }); } @凌驾 public int getItemCount(){ 返回歌曲。大小(); } 公共类MusicView文件夹扩展了RecyclerView.ViewHolder{ TextView歌曲名; TextView movieName; ImageView-songImg; 公共音乐文件夹(@NonNull View itemView){ 超级(项目视图); songName=itemView.findViewById(R.id.song_标题); movieName=itemView.findviewbyd(R.id.movie\u title); songImg=itemView.findviewbyd(R.id.song\u img); itemView.setOnClickListener(新视图.OnClickListener(){ @凌驾 公共void onClick(视图v){ if(侦听器!=null) onMusicClicked(getAdapterPosition(),v); } } ); } } }
公共类SongFragment扩展了片段{
//TODO:重命名参数参数,选择匹配的名称
//片段初始化参数,例如ARG_ITEM_NUMBER
私有静态最终字符串ARG_PARAM1=“PARAM1”;
私有静态最终字符串ARG_PARAM2=“PARAM2”;
//TODO:重命名和更改参数类型
私有字符串mParam1;
私有字符串mParam2;
私人回收站;
私有RecyclerView.Adapter myadapter;
private RecyclerView.LayoutManager LayoutManager;
视图;
私有ArrayList歌曲=新建ArrayList();
私人资源;
公共语境;
束;
//私人表演活动表演;
公共歌曲片段(){
//必需的空公共构造函数
}
/**
*使用此工厂方法创建的新实例
*使用提供的参数创建此片段。
*
*@param param1参数1。
*@param param2参数2。
*@return片段SongsFragment的新实例。
*/
//TODO:重命名和更改参数的类型和数量
公共静态SongFragment newInstance(字符串param1,字符串param2){
SongFragment=新的SongFragment();
Bundle args=新Bundle();
args.putString(ARG_PARAM1,PARAM1);
args.putString(ARG_PARAM2,PARAM2);
fragment.setArguments(args);
返回片段;
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
如果(getArguments()!=null){
mParam1=getArguments().getString(ARG_PARAM1);
mParam2=getArguments().getString(ARG_PARAM2);
}
ArrayList listTemp=MusicManager.getInstance(getContext()).getMusics();
如果(listTemp!=null)

songs.addAll((Collection尝试将
holder
上的onClickListener设置为
onBindViewHolder
方法,当调用侦听器时,需要将其传递到
setListener(MusicListener listener)
方法。类似如下:

 holder.itemView.setOnClickListener(v -> this.listener.onMusicClicked(position, v);});
 holder.itemView.setOnClickListener(v -> this.listener.onMusicClicked(position, songs.get(position);});
在我看来,最好将
界面MusicListener
更改为:

interface MusicListener {
        void onMusicClicked(int position, Music item);
}
并直接返回单击的项目,如下所示:

 holder.itemView.setOnClickListener(v -> this.listener.onMusicClicked(position, v);});
 holder.itemView.setOnClickListener(v -> this.listener.onMusicClicked(position, songs.get(position);});
此外,最好通过
MusicListene
public class SongFragment extends Fragment implements MusicAdapter.MusicListener
@Override
    public void onMusicClicked(int position, View view) {
}
musicAdapter.setListener(this::onItemClick);
public class SongFragment extends Fragment implements MusicAdapter.MusicListener {

    // TODO: Rename parameter arguments, choose names that match
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";

    // TODO: Rename and change types of parameters
    private String mParam1;
    private String mParam2;
    private RecyclerView recyclerview;
    private RecyclerView.Adapter myadapter;
    private RecyclerView.LayoutManager layoutManager;
    View view;
    private ArrayList<Music> songs=new ArrayList<>();
    private Resources res;
    public Context context;
    Bundle bundle;

    //  private ShowSongActivity show;
    public SongFragment() {

        // Required empty public constructor
    }

    /**
     * Use this factory method to create a new instance of
     * this fragment using the provided parameters.
     *
     * @param param1 Parameter 1.
     * @param param2 Parameter 2.
     * @return A new instance of fragment SongsFragment.
     */
    // TODO: Rename and change types and number of parameters
    public static SongFragment newInstance(String param1, String param2) {
        SongFragment fragment = new SongFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);


        }

        ArrayList<Music> listTemp = MusicManager.getInstance(getContext()).getMusics();

        if (listTemp != null)
            songs.addAll((Collection<? extends Music>) listTemp.clone());

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
       
        View view = inflater.inflate(R.layout.fragment_songs, container, false);
        recyclerview = (RecyclerView) view.findViewById(R.id.songs_recycler);

        MusicAdapter musicAdapter = new MusicAdapter(context,songs);
        recyclerview.setLayoutManager(new LinearLayoutManager(getActivity()));
        recyclerview.setAdapter(musicAdapter);
        recyclerview.setLayoutManager(new LinearLayoutManager(getContext(), RecyclerView.VERTICAL, false));
musicAdapter.setListener(this::onItemClick);

        return view;
    }
@Override
        public void onMusicClicked(int position, View view) {
          // here implement which you want
    }
}