3일을 붙잡아도 어디가 문젠지 모르겠습니다...
초기 빌드에 문제가 생기진 않습니다만 처음 실행, 종료후 2번째 실행하면 바로 널포인터 익셉션뜨면서 앱이 종료되네요....
첫번째 코드는 메인 액티비티의 onCreate, 퍼미션 받은 후 실행하는 Start입니다.
두번째 코드는 리스트를 생성합니다.
세번째는 커스텀어댑터입니다.
protected void onCreate(Bundle savedInstanceState) {
requestReadExternalStoragePermission();
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_music);
}
private void start(){
mContext = MusicServiceActivity.this;
init();
getMusicData();
}
private void init(){
adapter = new MusicAdapter(mContext, android.R.layout.simple_list_item_1, list);
adapter.setMusicBtnListener(new MusicAdapter.btnClickListener() {
@Override
public void MusicBtnClick(int position) {
EditTag(position);
}
});
musicListView = findViewById(R.id.menuList);
musicListView.setAdapter(adapter);
musicListView.setOnItemClickListener(this);
}
public class MusicAdapter extends ArrayAdapter<MusicData> {
private ArrayList<MusicData> item;
private Context mContext;
private ImageLoader loader;
private btnClickListener listener;
public interface btnClickListener {
void MusicBtnClick(int position);
}
public void setMusicBtnListener(btnClickListener l) {
listener = l;
}
public MusicAdapter( Context context, int resource, ArrayList<MusicData> item) {
super(context, resource, item);
this.mContext = context;
this.item = item;
//이미지 로더 init
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(mContext)
.threadPriority(10)
.denyCacheImageMultipleSizesInMemory()
.diskCacheFileNameGenerator(new Md5FileNameGenerator())
.tasksProcessingOrder(QueueProcessingType.LIFO)
.writeDebugLogs()
.build();
loader = ImageLoader.getInstance();
loader.init(config);
}
public void setAdapterList(ArrayList<MusicData> list){
item = list;
notifyDataSetChanged(); //Listview Refresh 기능
}
@NonNull
@Override
public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {
ViewHolder holder;
View v = convertView;
if(v == null){
LayoutInflater vi = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.row_music_list, null);
holder = new ViewHolder();
holder.img = v.findViewById(R.id.imgMusic);
holder.title = v.findViewById(R.id.txt_music_title);
holder.name = v.findViewById(R.id.txt_singer_name);
holder.btn =v.findViewById(R.id.isMusic_click);
v.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
final MusicData data = item.get(position);
if(data != null){
if(data.getMusicImg() != null){
DisplayImageOptions options = new DisplayImageOptions.Builder()
.showImageForEmptyUri(R.drawable.musical_note) // Uri주소가 잘못되었을경우(이미지없을때)
.resetViewBeforeLoading(false) // 로딩전에 뷰를 리셋하는건데 false로 하세요 과부하!
.cacheInMemory(true) // 메모리케시 사용여부
.cacheOnDisc(true) // 디스크캐쉬를 사용여부(사용하세요왠만하면)
.build();
loader.displayImage(data.getMusicImg().toString(), holder.img, options);
} else{ //이미지가 없을 경우가 있으므로 default image
holder.img.setBackgroundResource(R.drawable.musical_note);
}
holder.title.setText(data.getMusicTitle());
holder.name.setText(data.getSinger());
holder.btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
listener.MusicBtnClick(position);
}
});
}
return v;
}
class ViewHolder {
ImageView img;
TextView title;
TextView name;
Button btn;
}
}