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

다이얼로그 위치에 따른 오류 (주소록추가리스트)

0 추천

안녕하세요 문제를 정확히 모르겠어서 질문 드립니다 ㅠ

전체적인 과정은 일단 메인액티비티의 onCreate에서 주소록 추가버튼을 누르면 주소록이 뜨고 거기서 아이템을 클릭해서 이름과 전화번호를 받아오는 형식입니다.

여기서 문제는 onActivityResult (제일 아래에 있습니다) 에서 데이터를 가져온 뒤, 추가적으로 메일을 받아오기 위해서 다이얼로그를 띄워서 메일주소를 받아와서 리스트에 데이터로 함께 추가해 주고 싶은데...

오류가 나네요. 저기쓰여있는 다이얼로그 코드가 onCreate에서는 정상적으로 작동되는데 왜 다른데서는 안되는 걸까요...?

그리고 또 의문인것이... list에 데이터들을 연결해주는 어댑터 함수가 존재하는데, 다이얼로그 위치를 다르게 하니 여기서 오류가 난다고 뜨네요.


10-24 14:43:52.478 13886-13886/com.example.administrator.contacts E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                    Process: com.example.administrator.contacts, PID: 13886
                                                                                    java.lang.NullPointerException: Attempt to read from field 'android.widget.TextView com.example.administrator.contacts.MyListAdapter$ViewHolder.Name' on a null object reference
                                                                                        at com.example.administrator.contacts.MyListAdapter.getView(MyListAdapter.java:67)

코드는 메인액티비티랑 어댑터클래스 코드 올립니다.

 

package com.example.administrator.contacts;

import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.provider.ContactsContract;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    private ListView                mListView = null;
    private MyListAdapter           mListAdapter = null;
    private ArrayList<list_item>    list_itemArrayList;
    private Button                  mButton;
    private Context                 mContext;


    String name="조정석", number="010-1234-5678", mail = "hwasin@gmail.com";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //listview에 어댑터 생성
        mListView = (ListView) findViewById(R.id.ListView);
        list_itemArrayList = new ArrayList<list_item>();
        mListAdapter = new MyListAdapter(getApplicationContext(), list_itemArrayList);
        mListView.setAdapter(mListAdapter);


        //주소록 추가 버튼 이벤트
        mButton = (Button) findViewById(R.id.add_btn);
        mButton.setOnClickListener(new Button.OnClickListener() {
            public void onClick(View view) {
                //연락처 선택할 수 있게 주소록 가져옴
                Intent intent = new Intent(Intent.ACTION_PICK);
                intent.setData(ContactsContract.CommonDataKinds.Phone.CONTENT_URI); //주소록 uri와 연결
                startActivityForResult(intent, 0);
            }
        });

    }


    protected void onActivityResult(int requestCode, int resultCode, Intent data){
        if(resultCode == RESULT_OK){
            Cursor cursor = getContentResolver().query(data.getData(), new String[]{ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
                    ContactsContract.CommonDataKinds.Phone.NUMBER},null,null,null);
            cursor.moveToFirst();
            name = cursor.getString(0);
            number = cursor.getString(1);



            //*************************************************************************************
            AlertDialog.Builder alert = new AlertDialog.Builder(this);

            alert.setTitle("연락처추가");
            alert.setMessage("메일주소를 반드시 입력해 주세요!");

            // Set an EditText view to get user input
            final EditText input = new EditText(this);
            alert.setView(input);

            alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {
                    String value = input.getText().toString();
                    value.toString();
                    mail = value;
                    Toast.makeText(getApplicationContext(), mail, Toast.LENGTH_SHORT).show();
                    // Do something with value!
                }
            });
            alert.setNegativeButton("Cancel",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            // Canceled.
                        }
                    });

            alert.show();


            //내용추가
            list_itemArrayList.add( new list_item(name,number,mail));
            //어댑터연결
            mListAdapter = new MyListAdapter(MainActivity.this, list_itemArrayList);
            mListView.setAdapter(mListAdapter);



            Toast.makeText(getApplicationContext(), "추가되었습니다", Toast.LENGTH_SHORT).show();
            cursor.close();
        }
        super.onActivityResult(requestCode,requestCode,data);
    }

}

 

코드 짜깁기하는 초보라 어떻게 해결해야 할지 잘 모르겠습니다. 해결 방법 아시면 부디 알려주세요ㅠㅠㅠ

 

어댑터 코드는 글자수 초과로 댓글에 첨부합니다!
 

 

sksk (320 포인트) 님이 2016년 10월 24일 질문
package com.example.administrator.contacts;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import java.util.ArrayList;

/**
 * Created by Administrator on 2016-09-29.
 */

public class MyListAdapter extends BaseAdapter{
    private Context context = null;
    ArrayList<list_item> list_itemArrayList;
    ViewHolder viewholder;

    class ViewHolder{
        TextView Name;
        TextView Phone;
        TextView Mail;
    }



    public MyListAdapter(Context context, ArrayList<list_item> list_itemArrayList) {
        this.context = context;
        this.list_itemArrayList = list_itemArrayList;
    }


    @Override
    public int getCount() {  //리스트뷰가 가지고 있는 아이템의 갯수
        return list_itemArrayList.size();
    }

    @Override
    public Object getItem(int position) { //현재 어떤 아이템인지 알려주는 부분
        return list_itemArrayList.get(position);
    }

    @Override
    public long getItemId(int position) { //현재 어떤 포지션인지 알려주는 부분
        return position;
    }


    //리스트뷰에서 아이템과 xml을 연결하여 화면에 표시해주는 가장 중요한 부분
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if(convertView==null){
            //converView에 item.xml View를 불러옴
            convertView = LayoutInflater.from(context).inflate(R.layout.item,null);
            viewholder = new ViewHolder();

            //activity와 달리 inflate받은 view를 밑의 형식으로 적은 후 findViewById함
            viewholder.Name = (TextView)convertView.findViewById(R.id.Name_txt);
            viewholder.Phone = (TextView)convertView.findViewById(R.id.Phone_txt);
            viewholder.Mail = (TextView)convertView.findViewById(R.id.Mail_txt);
        }else{
            viewholder = (ViewHolder)convertView.getTag();
        }

        viewholder.Name.setText(list_itemArrayList.get(position).name);
        viewholder.Phone.setText(list_itemArrayList.get(position).phone);
        viewholder.Mail.setText(list_itemArrayList.get(position).mail);

        return convertView;
    }

}


참고로 item.xml은 리스트 한 행에 나타낼 데이터 (이름,전화번호,메일) 레이아웃입니다.

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...