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