android - 公共类 Adpter、onCreateViewHolder、MediaPlayer 的 NullPointerException
问题描述
我正在将数据传递给我的 recyclerview 适配器
RecyclerViewAdapter
package com.example.alarm.Apters;
import android.content.Context;
import android.media.MediaPlayer;
import android.net.Uri;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.example.alarm.ExtraClass.External_Stotrage;
import com.example.alarm.Models.RingtoneModel;
import com.example.alarm.R;
import java.util.ArrayList;
public class Ringtone_Adpter extends RecyclerView.Adapter<Ringtone_Adpter.ViewHolder> {///24 Ist NullPointer exception
ArrayList<RingtoneModel> list;
Context context;
Uri finalUri_send;
public Ringtone_Adpter(ArrayList<RingtoneModel> list, Context context) {
this.list = list;
this.context = context;
}
public Uri getFinalUri_send() {
return finalUri_send;
}
public Ringtone_Adpter(){}
@NonNull
@Override
public Ringtone_Adpter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.ringtone_lyt_res_file,parent,false);
return new ViewHolder(view); ///45 2nd NullPointer exception
}
@Override
public void onBindViewHolder(@NonNull Ringtone_Adpter.ViewHolder holder, int position) {
String ringtonename = list.get(position).getSongName();
Uri songuri = Uri.parse(list.get(position).getUri());
holder.setData(ringtonename,songuri);
this.finalUri_send = holder.getUriforalarmoutside();
}
@Override
public int getItemCount() {
Log.d("Length TAG", String.valueOf(list.size()));
return list.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
ImageView play_pause_icon,Volume_icon;
TextView Ringtone_name,RingLength;
Button Set_btn;
SeekBar seekBar;
Uri SongUri = null;
Uri Uriforalarm;
public void setData(String ringtonename, Uri songuri) {
Ringtone_name.setText(ringtonename);
this.SongUri = songuri;
}
public ViewHolder(@NonNull View itemView) {
super(itemView);
play_pause_icon = itemView.findViewById(R.id.play_pause_icon);
Volume_icon = itemView.findViewById(R.id.Volume_icon);
Ringtone_name = itemView.findViewById(R.id.Ringtone_name);
Set_btn = itemView.findViewById(R.id.Set_btn);
RingLength = itemView.findViewById(R.id.RingLength);
seekBar = itemView.findViewById(R.id.seekBar);
// TODO: Actual code
MediaPlayer mediaPlayer = MediaPlayer.create(context,SongUri);//83 3rd NullPointer exception
RingLength.setText(mediaPlayer.getDuration());
play_pause_icon.setOnClickListener(v ->{
if (!mediaPlayer.isPlaying()){
play_pause_icon.setImageResource(R.drawable.ic_baseline_pause_circle_filled_24);
Volume_icon.setVisibility(View.INVISIBLE);
mediaPlayer.start();
}else {
play_pause_icon.setImageResource(R.drawable.ic_baseline_play_circle_filled_24);
Volume_icon.setVisibility(View.VISIBLE);
mediaPlayer.pause();
}
});
Set_btn.setOnClickListener(v ->{
Uriforalarm = SongUri;
new External_Stotrage().SavePrivatly(context,Uriforalarm,"Ring For Ringing");
});
}
final public Uri getUriforalarmoutside(){
return Uriforalarm;
}
}
}
但我一次得到 NUllpointerexception
java.lang.NullPointerException
at android.media.MediaPlayer.setDataSource(MediaPlayer.java:889)
at android.media.MediaPlayer.setDataSource(MediaPlayer.java:874)
at android.media.MediaPlayer.create(MediaPlayer.java:808)
at android.media.MediaPlayer.create(MediaPlayer.java:789)
at com.example.alarm.Apters.Ringtone_Adpter$ViewHolder.<init>(Ringtone_Adpter.java:89) //at line 89
at com.example.alarm.Apters.Ringtone_Adpter.onCreateViewHolder(Ringtone_Adpter.java:45) //at line 45
at com.example.alarm.Apters.Ringtone_Adpter.onCreateViewHolder(Ringtone_Adpter.java:24) //at line 24
第 89 行 == MediaPlayer mediaPlayer = MediaPlayer.create(context,SongUri);//83
第 45 行 == 返回新的 ViewHolder(view); //45
第 24 行 === 公共类 Ringtone_Adpter 扩展 RecyclerView.Adapter<Ringtone_Adpter.ViewHolder> { //24
解决方案
MediaPlayer mediaPlayer = MediaPlayer.create(context,SongUri);//83 3rd NullPointer 异常
这就是问题所在。您正在尝试在实际为 SongUri 赋值之前创建一个 MediaPlayer 实例。
为 SongUri 赋值后,在 setData() 函数中创建 MediaPlayer 实例。请在您的代码中进行以下更改,它应该可以正常工作。
public void setData(String ringtonename, Uri songuri) {
Ringtone_name.setText(ringtonename);
this.SongUri = songuri;
MediaPlayer mediaPlayer = MediaPlayer.create(context,SongUri);//83 3rd NullPointer exception
RingLength.setText(mediaPlayer.getDuration());
play_pause_icon.setOnClickListener(v ->{
if (!mediaPlayer.isPlaying()){
play_pause_icon.setImageResource(R.drawable.ic_baseline_pause_circle_filled_24);
Volume_icon.setVisibility(View.INVISIBLE);
mediaPlayer.start();
}else {
play_pause_icon.setImageResource(R.drawable.ic_baseline_play_circle_filled_24);
Volume_icon.setVisibility(View.VISIBLE);
mediaPlayer.pause();
}
});
Set_btn.setOnClickListener(v ->{
Uriforalarm = SongUri;
new External_Stotrage().SavePrivatly(context,Uriforalarm,"Ring For Ringing");
});
}
public ViewHolder(@NonNull View itemView) {
super(itemView);
play_pause_icon = itemView.findViewById(R.id.play_pause_icon);
Volume_icon = itemView.findViewById(R.id.Volume_icon);
Ringtone_name = itemView.findViewById(R.id.Ringtone_name);
Set_btn = itemView.findViewById(R.id.Set_btn);
RingLength = itemView.findViewById(R.id.RingLength);
seekBar = itemView.findViewById(R.id.seekBar);
// TODO: Actual code
}
推荐阅读
- python - 使用 Ripley 的 K 和 L 函数进行共定位分析
- java - 在接口中引入静态方法比在 java 8 中引入最终方法(如果有的话)有什么好处?
- chart.js - 图表 JS 版本 3+。如何在刻度回调函数中获取刻度的标签?
- ruby-on-rails - 当 Job 重试时,Sidekiq/Redis 在哪里或如何存储对象?
- spring-boot - 我可以让 /swagger-ui.html 重定向到 /swagger-ui/
- c++ - 为什么不重写此方法?
- sql - 我想对包含空值的列执行数学运算
- python-3.x - 在python中使用accumulate()和lambda函数求列表[8,1,4,2,1]的累积平均值
- nginx - How to configure uvicorn in nginx for justpy
- c - c inherited function extension