마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

setAdapter의 널포인터 익셉션... [closed]

0 추천

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;
    }
}

 

질문을 종료한 이유: 죄송합니다...requestpermission을 뒤에 뒀어야하네요...
mandoo (140 포인트) 님이 2019년 1월 26일 질문
mandoo님이 2019년 1월 26일 closed
...