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

커스텀어댑터에서 다이얼로그를 띄울려고 하는데요 에러가 떠요

0 추천

제가 하고자 하는게 서버에서 받아온 값을 리스트뷰에 뿌린 후에 리스트 뷰에서 사진을 선택하면 다시 서버에서 받아온 값을 리스트뷰를 포함한 다이얼로그에 띄울려고 하는데요

---일단 OnClickListener 부분이고요

View.OnClickListener photoClick = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        saveTag tag = (saveTag) v.getTag();
        final int pos = tag.position;
        switch (v.getId()) {
            case R.id.photo:
                sendObject(tag.id11);
                JSONTask myjson = new JSONTask();
                myjson.execute("http://222.114.47.134:52417/post");
                
        }
    }
};

private void sendObject(String jid) {
    count = 1;
    showGroup = new JSONObject();
    try {
        showGroup.accumulate(CHECK, "groupList");
        showGroup.accumulate("id", jid);
        Log.d(TAG, "member변환 완료");
    } catch (JSONException e) {
        e.printStackTrace();
        Log.d(TAG, "json에러");
    }
}
그후에 다이얼로그를 만드는 메서드
 public void viewGroupList(String divGroupInfo[]){
        view1 = inflater.inflate(R.layout.list,null);
        listview2 = (ListView)view1.findViewById(R.id.groupListView);
        groupInfo = new ArrayList<>();
        for(int i=0;i<divGroupInfo.length;i++)
        {
            Log.d(TAG,"div값?"+divGroupInfo[i]);
            groupInfo.add(divGroupInfo[i]);
        }
       /*
        for(int i=0;i<divGroupInfo.length;i++)
        {
            Log.d(TAG,"arraylist값"+Integer.toString(Integer.parseInt(groupInfo.get(i).toString())));
        }*/
        ArrayAdapter<String> adp = new ArrayAdapter<String>(mContext,android.R.layout.simple_list_item_1,groupInfo);
        listview2.setAdapter(adp);
        AlertDialog.Builder groupNameCount = new AlertDialog.Builder(mContext);
        groupNameCount.setView(view1);
        groupNameCount.create();
        groupNameCount.show();

}그다음에 이 메서드를
protected void onPostExecute(String result) {
    super.onPostExecute(result);
    Log.d(TAG, result);
    data = result.split("\"");
    Log.d(TAG, "data[]의 길이는?" + data.length);
    for (int q = 0; q < data.length; q++) {
        Log.d(TAG, data[q]);
    }

    nameLength = data.length / 6;
    totalGroupData = new String[nameLength];
    testSplit(result,nameLength);
    for (int i = 0; i < nameLength; i++) {
        Log.d(TAG, "result값은?" + data[i * 6 + 3]);
        int a = data[i * 6 + 3].indexOf("_");
        data[i * 6 + 3] = data[i * 6+ 3].substring(0, a);
        Log.d(TAG, "새로 설정한 result값은?" + data[i * 6 + 3]);
        totalGroupData[i] ="그룹명:"+data[i*6+3]+"\t인원수:"+countData[i];
        Log.d(TAG,"totalGroupData는?"+totalGroupData[i]);

    }
    viewGroupList(totalGroupData);

}
이렇게 사용하였는데요 
마지막 viewGroupList(totalGroupData)부분이 오류가 난다고 로그캣에 떠요
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference
이게 에러메세지네요 ㅜ
아 그리고 divGroupInfo를 로그 캣으로 찍어보면 값이 다 들어가 있어요
너무먼개발자 (1,300 포인트) 님이 2018년 10월 18일 질문

1개의 답변

0 추천
어쨌거나 listview2가 null인데, 거기다  setAdapter()한다는 내용이니 다시 한 번 잘 살펴보세요.
쎄미 (162,410 포인트) 님이 2018년 10월 18일 답변
예 알겠습니다. 저기 그런데 하나만 여쭤보고 싶은게 있는데 제가 이문제에 대해서 고민하고 찾아보다가 어떤 사람은 어뎁터에서 다이얼로그를 사용해서 그렇다고 핸들러를 만들어서 어댑터 안 클릭 이벤트에 핸들러로 메시지를 보내서 핸들러에서 메시지를 받아서 다이얼로그를 띄우는 식으로 설계를 해보라고 하는데 이렇게 하는게 맞는 방법인가요??
네. 어댑터 안에서는 다이얼로그 같은 걸 안 띄우는게 맞아요.
아 그러면 띄우고 싶을때는 어댑터 안에서 핸들러를 통해서 이벤트 값을 메인액티비티로 가져와서 거기서 그 값을 가지고 다이얼 로그를 띄워야 하는건가요?
네. 어댑터는 목록 데이터를 표시하는 용도로만 쓰는게 코드가 깔끔해집니다.
감사합니다. 다시 시도 해볼께요
adapter에서 다이얼로그를 띄우는 것과 같은 데이터 디스플레이와 직접 관련이 없는 액션을 하려면 handler를 사용해도 되지만 adapter의 listener안에서 처리하시는게 더 나아 보입니다.
...