Android:如何在RecyclerView适配器onClick方法中播放歌曲(使用音乐服务类)

Android:如何在RecyclerView适配器onClick方法中播放歌曲(使用音乐服务类),android,android-fragments,android-service,android-recyclerview,Android,Android Fragments,Android Service,Android Recyclerview,我正在做一个项目,其中我必须创建一个简单的音乐播放器应用程序与RecyclerView(已遵循Codetut plus教程)。 我在一个碎片里膨胀了一个视图。 但我被困在如何播放歌曲时,项目点击 当用户单击RecyclerView中的任何项目(包含歌曲列表)时,我尝试播放歌曲。 我想在音乐服务课的帮助下演奏这首歌,但不知道怎么做。 任何关于如何做到这一点的帮助都会很有帮助 虽然我试图在onClick方法中调用MusicService类,但我遇到了错误。!(错误代码显示在底部) 这是片段 publ

我正在做一个项目,其中我必须创建一个简单的音乐播放器应用程序与RecyclerView(已遵循Codetut plus教程)。 我在一个碎片里膨胀了一个视图。 但我被困在如何播放歌曲时,项目点击

当用户单击RecyclerView中的任何项目(包含歌曲列表)时,我尝试播放歌曲。 我想在音乐服务课的帮助下演奏这首歌,但不知道怎么做。 任何关于如何做到这一点的帮助都会很有帮助

虽然我试图在onClick方法中调用MusicService类,但我遇到了错误。!(错误代码显示在底部)

这是片段

public class Tab3 extends Fragment {

private MusicService musicSrv;
private Intent playIntent;
private boolean musicBound=false;

private static final String KEY_LAYOUT_MANAGER = "layoutManager";

private RecyclerView mRecyclerView;
private SongAdapter mAdapter;
protected List<SongsData> songsList;

private enum LayoutManagerType {
    GRID_LAYOUT_MANAGER,
    LINEAR_LAYOUT_MANAGER
}

protected LayoutManagerType mCurrentLayoutManagerType;

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

    songsList = new ArrayList<SongsData>();

    getSongList();

    Collections.sort(songsList, new Comparator<SongsData>(){
        public int compare(SongsData a, SongsData b){
            return a.getTitle().compareTo(b.getTitle());
        }
    });

}


public Tab3() {
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_tab3, container,
            false);

    mRecyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerview);

    mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

    mCurrentLayoutManagerType = LayoutManagerType.LINEAR_LAYOUT_MANAGER;

    if (savedInstanceState != null) {
        mCurrentLayoutManagerType = (LayoutManagerType) savedInstanceState
                .getSerializable(KEY_LAYOUT_MANAGER);
    }

    mAdapter = new SongAdapter(songsList, getContext());
    mRecyclerView.setAdapter(mAdapter);

    return rootView;
}


public void getSongList() {

    ContentResolver musicResolver = getActivity().getContentResolver();
    Uri musicUri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    Cursor musicCursor = musicResolver.query(musicUri, null, null, null, null);

    if(musicCursor!=null && musicCursor.moveToFirst()){
        int titleColumn = musicCursor.getColumnIndex
                (android.provider.MediaStore.Audio.Media.TITLE);
        int idColumn = musicCursor.getColumnIndex
                (android.provider.MediaStore.Audio.Media._ID);
        int artistColumn = musicCursor.getColumnIndex
                (android.provider.MediaStore.Audio.Media.ARTIST);
                (MediaStore.Audio.Albums.ALBUM_ART); 
        do {
            long thisId = musicCursor.getLong(idColumn);
            String thisTitle = musicCursor.getString(titleColumn);
            String thisArtist = musicCursor.getString(artistColumn);
            songsList.add(new SongsData(thisId, thisTitle, thisArtist));
        }
        while (musicCursor.moveToNext());
    }
}  }
这是适配器类

public class CustomViewHolder  extends RecyclerView.ViewHolder
    implements View.OnClickListener, View.OnLongClickListener{

CardView cv;
TextView title;
TextView description;
ImageView imageView;

private ClickListener clickListener;

public CustomViewHolder(View itemView) {
    super(itemView);
    cv = (CardView) itemView.findViewById(R.id.cardView);
    title = (TextView) itemView.findViewById(R.id.title);
    description = (TextView) itemView.findViewById(R.id.description);
    imageView = (ImageView) itemView.findViewById(R.id.imageView);
    itemView.setOnClickListener(this);
    itemView.setOnLongClickListener(this);
}
public interface ClickListener {
    void onClick(View v, int position, boolean isLongClick);

}
public void setClickListener(ClickListener clickListener) {
    this.clickListener = clickListener;
}

@Override
public void onClick(View v) {
    clickListener.onClick(v, getPosition(), false);
}

@Override
public boolean onLongClick(View v) {
    clickListener.onClick(v, getPosition(), true);
    return true;
}   }
public class SongAdapter extends RecyclerView.Adapter<CustomViewHolder> {

public List<SongsData> list = Collections.emptyList();
Context context;

public SongAdapter(List<SongsData> list, Context context) {
    this.list = list;
    this.context = context;
}

@Override
public CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View songView = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_sample, parent, false);
    CustomViewHolder myHolder = new CustomViewHolder(songView);
    return myHolder;
}

@Override
public void onBindViewHolder(CustomViewHolder holder, int position) {

    holder.setClickListener(new CustomViewHolder.ClickListener() {

        @Override
        public void onClick(View v, int pos, boolean isLongClick) {
            if (isLongClick) {
                // View v at position pos is long-clicked.
                Toast.makeText(context, "You just Long Clicked me.. Wowww LOL", Toast.LENGTH_SHORT).show();
            } else {
                // View v at position pos is clicked.
                Intent intent = new Intent(context.getApplicationContext(), MusicService.class);
                context.startService(intent);
                Toast.makeText(context, "You just Clicked me.. Wowww LOL", Toast.LENGTH_SHORT).show();
            }
        }
    });

    holder.getItemId();
    holder.title.setText(list.get(position).title);
    holder.description.setText(list.get(position).description);
}

@Override
public int getItemCount() {
    //returns the number of elements the RecyclerView will displaye
    return list.size();
}

@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
    super.onAttachedToRecyclerView(recyclerView);
}


//Insert a new item to the RecyclerView on a predefined position
public void insert(int position, SongsData data) {
    list.add(position, data);
    notifyItemChanged(position);
}

public void remove(SongsData data) {
    int position = list.indexOf(data);
    list.remove(position);
    notifyItemRemoved(position);
}  }  
公共类SongAdapter扩展了RecyclerView.Adapter{
public List=Collections.emptyList();
语境;
公共SongAdapter(列表、上下文){
this.list=列表;
this.context=上下文;
}
@凌驾
公共CustomViewHolder onCreateViewHolder(视图组父级,int-viewType){
View-songView=LayoutInflater.from(parent.getContext()).flate(R.layout.fragment_sample,parent,false);
CustomViewHolder myHolder=新CustomViewHolder(songView);
归还我的持有人;
}
@凌驾
公共无效onBindViewHolder(CustomViewHolder,int位置){
holder.setClickListener(新的CustomViewHolder.ClickListener(){
@凌驾
公共void onClick(视图v、int-pos、布尔值isLongClick){
如果(单击){
//长时间单击位置处的视图v。
Toast.makeText(上下文,“你刚才长时间点击了我..Wowww LOL”,Toast.LENGTH\u SHORT.show();
}否则{
//单击位置处的视图v。
Intent Intent=新意图(context.getApplicationContext(),MusicService.class);
上下文。startService(意图);
Toast.makeText(上下文,“你刚才点击了我..Wowww LOL”,Toast.LENGTH_SHORT.show();
}
}
});
holder.getItemId();
holder.title.setText(list.get(position.title));
holder.description.setText(list.get(position.description));
}
@凌驾
public int getItemCount(){
//返回RecyclerView将显示的元素数
返回list.size();
}
@凌驾
附加ToRecyclerView(RecyclerView RecyclerView)上的公共无效{
super.onAttachedToRecyclerView(recyclerView);
}
//在预定义位置向RecyclerView插入新项目
公共空白插入(整数位置,宋斯达数据){
列表。添加(位置、数据);
(职位)变更;
}
公共无效删除(SongsData数据){
int position=list.indexOf(数据);
列表。删除(位置);
已移除(位置)的项目;
}  }  
当我点击一个项目时,这里有一个错误-
E/AndroidRuntime:FATAL EXCEPTION:main
进程:com.example.ansh.makingmusicapp2,PID:16713

java.lang.RuntimeException:无法启动服务com.example.ansh.makingmusicapp2。MusicService@b433953意图{cmp=com.example.ansh.makingmusicapp2/.MusicService}:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“boolean java.lang.String.equals(java.lang.Object)” 位于android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3027) 位于android.app.ActivityThread.-wrap17(ActivityThread.java) 在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1442) 位于android.os.Handler.dispatchMessage(Handler.java:102) 位于android.os.Looper.loop(Looper.java:148) 位于android.app.ActivityThread.main(ActivityThread.java:5417) 位于java.lang.reflect.Method.invoke(本机方法) 在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run上(ZygoteInit.java:726) 位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
原因:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“boolean java.lang.String.equals(java.lang.Object)” 在com.example.ansh.makingmusicapp2.MusicService.onStartCommand(MusicService.java:64)上 位于android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3010) 位于android.app.ActivityThread.-wrap17(ActivityThread.java) 在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1442) 位于android.os.Handler.dispatchMessage(Handler.java:102) 位于android.os.Looper.loop(Looper.java:148)
public class SongAdapter extends RecyclerView.Adapter<CustomViewHolder> {

public List<SongsData> list = Collections.emptyList();
Context context;

public SongAdapter(List<SongsData> list, Context context) {
    this.list = list;
    this.context = context;
}

@Override
public CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View songView = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_sample, parent, false);
    CustomViewHolder myHolder = new CustomViewHolder(songView);
    return myHolder;
}

@Override
public void onBindViewHolder(CustomViewHolder holder, int position) {

    holder.setClickListener(new CustomViewHolder.ClickListener() {

        @Override
        public void onClick(View v, int pos, boolean isLongClick) {
            if (isLongClick) {
                // View v at position pos is long-clicked.
                Toast.makeText(context, "You just Long Clicked me.. Wowww LOL", Toast.LENGTH_SHORT).show();
            } else {
                // View v at position pos is clicked.
                Intent intent = new Intent(context.getApplicationContext(), MusicService.class);
                context.startService(intent);
                Toast.makeText(context, "You just Clicked me.. Wowww LOL", Toast.LENGTH_SHORT).show();
            }
        }
    });

    holder.getItemId();
    holder.title.setText(list.get(position).title);
    holder.description.setText(list.get(position).description);
}

@Override
public int getItemCount() {
    //returns the number of elements the RecyclerView will displaye
    return list.size();
}

@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
    super.onAttachedToRecyclerView(recyclerView);
}


//Insert a new item to the RecyclerView on a predefined position
public void insert(int position, SongsData data) {
    list.add(position, data);
    notifyItemChanged(position);
}

public void remove(SongsData data) {
    int position = list.indexOf(data);
    list.remove(position);
    notifyItemRemoved(position);
}  }