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

dialog에 listview 기능 구현하기.

+1 추천

 

 

버튼을 누르면 다이얼로그가 팝업되면서, 그 안에 정보들을 나열할 listview를 넣으려고 하는데요,

xml에서 다이얼로그나, 버튼이 있는 메인 레이아웃은 다 만들어놨는데, 다이얼로그 팝업 버튼을 누르면 

setadapter부분에서 널포인터익셉션 오류가 발생합니다. 

다이얼로그에 listview기능을 구현할 때와 보통의 activity상에서 구현하는 것과 다른것이 있나요?

-

/리스트뷰
		noticeList = (ListView)findViewById(R.id.susinList);
                //다이얼로그xml에 있는 listView(susinList)
		

		//배열
		noticeArr = new ArrayList<String>();
	//	ArrayList<String>choiceArr = new ArrayList<String>();
		
		//어댑터
		noticeAdap = new ArrayAdapter<String>(this,R.layout.listview_custom,R.id.listText,noticeArr);
		int aa=1;
		//listview에 arrayadapter연결
		noticeList.setAdapter(noticeAdap); <-에러발생
		
		//listview의 선택모드 지정
		noticeList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);//single에서 multiple로 변경(체크박스)
				
		ArrayList temp = select_stu();
		for(int i=0; i < temp.size(); i++)
		{
			noticeArr.add(temp.get(i).toString()); 
		}
		noticeAdap.notifyDataSetChanged(); //새로 갱신해서 보여줌~
}//onCreate

@Override
	public void onClick(View v) {
	
		switch(v.getId())
		{
			//수신자 리스트	(다이얼로그 형식)
			case R.id.choice_list:
				//선택한 수신자 보여주기
				//커스텀 다이얼로그
				
				Context con = notice.this;
				AlertDialog.Builder  builder;
				AlertDialog listdialog;
				
				inflate = (LayoutInflater)con.getSystemService(LAYOUT_INFLATER_SERVICE);
				final View layout=
						inflate.inflate(R.layout.list_dialog,(ViewGroup)findViewById(R.id.list_dialog_layout));
				
				//에디트텍스트들
				builder = new AlertDialog.Builder(con);
				builder.setView(layout);//view
				
				listdialog=builder.create();
				
				if(cardNum==null)
				{
					Toast.makeText(getApplicationContext(), "선택한 수신자가 없습니다.", 2000).show();
				}
				else//선택된 사람을 리스트에 띄워준다.
				{
					Toast.makeText(getApplicationContext(), cardNum, 2000).show();
					String[] numbers = cardNum.split(";");
					for(int i=0;i<numbers.length;i++)
					{
						Log.d("배열:",numbers[i]);
					}
				
				}
				
			
				
				Toast.makeText(getApplicationContext(), "dfasdtew", 2000).show();
				
				
				
					listdialog.setButton("확인", new DialogInterface.OnClickListener() {
						
						@Override
						public void onClick(DialogInterface dialog, int which) {
							// TODO Auto-generated method stub
							
						//	dialog.dismiss();
						}
					});//확인
					
					listdialog.setButton2("취소", new DialogInterface.OnClickListener() {
						
						@Override
						public void onClick(DialogInterface dialog, int which) {
							// TODO Auto-generated method stub
							
						//	dialog.dismiss();
						}
					});//취소
				listdialog.show();
				break;
			
                }
}

 

anci (19,950 포인트) 님이 2014년 3월 13일 질문
테스트 해보진 않았지만 개념상으로는 제가 볼때 크게 다르지 않아요~ 에러가 발생하는 이유는 noticeList 가 현재 뷰에 없는 상태인데 참조해서 어댑터를 갖다붙이는데 사용했기때문이에요. 그러니까 다이얼로그 뷰 화면을 생성할때 find 로 객체를 찾고 똑같이 사용해주시면 될거같아요 '-'
안녕하세요, 댓글 감사합니다.
noticeList의 뷰가  noticeList = (ListView)findViewById(R.id.susinList);
인데, 이게 메인 xml에는 없고 오로지 dialog쪽의 xml에만 존재합니다.
메인은 그냥 다이얼로그를 띄우기 위한 버튼만 있구요.
(xml에 버튼 추가했고, 메인의 onCreate에 선언해놨습니다.)
혹시 이래서 처음에 앱을 실행했을 때 에러가 발생하는 것일까요?ㅠ..
로그를 볼 수 없어 확실 하지 않지만
리스트뷰를 찾을 수 없어 나는 에러 같습니다.

다른 레이아웃의 뷰는 그 레이아웃 안에서 찾아야 합니다.

noticeList = (ListView)findViewById(R.id.susinList); ->

final View layout= inflate.inflate( ... );
noticeList = (ListView) layout.findViewById(R.id.susinList);
아 감사합니다..ㅠㅠ 레이아웃을 앞에 붙여야 했군요..
findviewById 앞에 알려주신대로 view layout 을 추가로 붙이니 됩니다.
정말 감사드립니다.(__)

2개의 답변

+2 추천
 
채택된 답변
그건 리스트뷰가 아니라 싱글 초이스 팝업 다이얼로그로 해야하는거 아닌가요?

http://mossila.wordpress.com/2011/05/10/android-dialog-single-choice-items/
쎄미 (162,410 포인트) 님이 2014년 3월 13일 답변
anci님이 2014년 3월 14일 채택됨
안녕하세요, 댓글 감사합니다 (__)
dialog에도 listview를 구현할 수있을거라 생각했는데, activity처럼 listview를 만드는게 아니라, 멀티나 싱글 초이스로 구현해야 하는건가요? 굳이 다이얼로그로 안해도 되는데, 보기 편하게 메인보다 조금 작게 리스트뷰를 만들려고 했었습니다..ㅠ.ㅠ
위의 코딩과 같은 방식으로 ,editText로 입력값을 주고받는 다이얼로그를 이전에 만들어봐서, 같은방식으로 다이얼로그xml에  listview를 주면 되지 않을까 했습니다만..이 방식이 안되는것인가요?
+1 추천

음~ 설명을 드리면.. '-';

이클립스환경에서 임의 조작이 없으셨다면

디폴트로 오토 빌드에 체크가 되어있어서

xml 작성 후 저장하는 순간 R.java 에 자동으로 리소스가 등록되요.

 

그렇기때문에 단순히 아래와 같이 선언하여

noticeList = (ListView)findViewById(R.id.susinList);

R.java 에서 리소스 아이디를 찾는 건 문제가 되지않아요.

 

문제는 onCreate 에서 setContentView 로

지정한 레이아웃을 표시해주는데

이 때, noticeList 라는 이름의 리스트뷰는

setContentView 에서 지정한 레이아웃에 없는 녀석이지요~

 

그래서 onCreate 에서는 아래와 같이

noticeList.setAdapter(noticeAdap);

사용하려고 하면 에러가 발생하는 겁니다.

 

예를 들어 뷰 페이저를 사용할 때도 view 에

페이지별로 지정할 xml 을 먼저 붙이고

그 다음에 해당 xml 에 들어있는 버튼 등의 위젯의

아이디를 가져와서 사용하잖아요? 그거랑 같은 이치에요.

 

글이 길었는데 이해가 되셨는지 모르겠네요 ^^;;

초보개발자ㅠ (33,870 포인트) 님이 2014년 3월 14일 답변
아, 무슨 말인지 알겠습니다.
main의 onCreate의 setContentView로 지정한.. 즉
setContentView(R.layout.main); <-main.xml에 listview가 없고 button만 있어서 에러가 난다는 것인가요? 흠..그럼 dialog.xml에만 listView가 있어서 그런건데, 이런 경우에는 어떻게 해야하는건가요..?
제가 급한 일이 있어서 자세히 코딩은 못해드리겟네요 ;;
final View layout = inflate.inflate(R.layout.list_dialog,(ViewGroup)findViewById(R.id.list_dialog_layout));
여기서 다이얼로그의 레이아웃을 가져와서 layout 이라는 이름의 뷰에 붙이니까
그 밑 부분에 ListView noticeList = (ListView) layout.findViewById(R.id.susinList); 를 하시고
이후에 사용하시면 (셋어댑터)를 하면 될거 같아요
바쁘신데 늘 알려주셔서 감사합니다 ㅠㅠ초보개발자님과 페코페코님이 알려주신대로 layout 요거 하나만 붙였더니 떡 실행이 되네요..^^; 이참에 잊지 않게 꼭 공부해둬야겠습니다. 감사합니다!
...