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

리스트뷰 변경될 때 갱신.

+1 추천

안녕하세요.

adapter.notifyDataSetChanged(); 를 이용해서 리스트뷰를 갱신하는데, 갱신 타이밍을 못잡아서 질문드립니다.

두개의 액티비티 클래스(A,B)가 있습니다. 

클래스A는 B로 이동하는 버튼 하나만 있습니다. 클래스 A에서 버튼A를 눌러서 B클래스로 이동하면,

intent로 새로운 레이아웃이 뜨고, B클래스내에서 작업을 처리합니다.

B클래스 안에는 listview와 갱신 버튼이 있는데요, DB 테스트 중이라 간단하게 listview에 있는 회원 이름을

바꾸도록 만들었습니다.  현재 리스트뷰에 김아무개 22살 이런식으로 값을 넣었구요,

갱신 버튼을 누르면 김아무개의 나이를 20살로 바꾸도록 쿼리문도 짰습니다.

값은 제대로 변경이 되는데, 다만 한가지 문제점이.. 갱신버튼을 누르고 확인[다이얼로그] 을 누를 때

listView의 기존의 김아무개 22살->김아무개 20살 로 즉시 변경되도록 하고 싶은데, 확인을 눌러도 값이 바로 변하지 않네요. 뒤로 버튼을 눌러서 B에서 나온 후, A클래스에서 버튼A를 눌러  B클래스로 이동하면 그제서야 값이 바뀐게 보입니다.

 

dialog.setButton("확인", new DialogInterface.OnClickListener() {
					
@Override
public void onClick(DialogInterface dialog, int which) 
{		
  Toast.makeText(getApplicationContext(), 
  "확인버튼누름", Toast.LENGTH_SHORT).show();
  update_info();//김아무개의 나이를 변경하기 위한 함수
  adapter.notifyDataSetChanged();//변경된 데이터 확인 후, 화면 갱신	
  dialog.dismiss();//자동닫기
}
}); //확인

 

이런식으로 구현했습니다. 혹시 adapter.notifyDataSetChanged();의 위치가 잘못된걸까요?

 

anci (19,950 포인트) 님이 2014년 3월 7일 질문

2개의 답변

+1 추천

adapter.notifyDataSetChanged();//변경된 데이터 확인 후, 화면 갱신

위 부분을 다이얼로그안에 넣지말고

update_info 함수 안에 조건 갱신된경우 넣어보세요~

초보개발자ㅠ (33,870 포인트) 님이 2014년 3월 7일 답변
답변감사합니다. 함수안에 직접 넣으니 에러가 발생하네요 ㅠ
public void update_info()
{   
listdb    = SQLiteDatabase.openDatabase(DB_PATH, null,SQLiteDatabase.OPEN_READWRITE | SQLiteDatabase.NO_LOCALIZED_COLLATORS);
String sql = "UPDATE info SET AGE = '20' where id ='22222' ";
adapter.notifyDataSetChanged();
listdb.execSQL(sql);
listdb.close();
listdb = null;
    }
이런식으로 했는데..
어떤 에러가 발생하나요 '-'?

그리고 db 정보를 갱신 후에 변경했다고 알려주셔야하는데
쿼리 실행전에 사용하시면..

String sql = "UPDATE info SET AGE = '20' where id ='22222' ";
listdb.execSQL(sql);
adapter.notifyDataSetChanged();
listdb.close();
일단은 좀 더 살피고 있습니다ㅠㅎㅎ; 널익셉션이 뜨는데, 고치는데까지 고쳐보고 정확하게 원인을 알아보겠습니다 ㅠㅠ
아 근데 B클래스 진입시 onCreate에서 DB로부터 데이터 받아와서 리스트 생성 후 어댑터에다가 붙인 후 뷰로 뿌려주는거 같은데
listdb 수정 후에 다시 리스트로 셋어댑터 해주는 부분이 있나요? onCreate 에만 정의 되어있는건 아니죠? 소스 보고시프당 '-' 주먹밥님 홧팅~
초보개발자ㅠ/댓글 감사합니다 .
주말에 일이 있어서 이제서야 댓글을 쓰게 되었네요.
일단 수정하는거는 성공했습니다. 수정하고 확인을 누른 뒤, arrList를 다시 불러왔습니다. 이렇게 하니 정보가 변경되는게 즉시 보이더라구요 ㅎㅎ 리스트는 다뤄본적이 많지 않은지라 헤매였네요..셋어뎁터도 확인해보겠습니다. 혹시 listView.setAdapter(adapter); 이런 부분을 말씀하시는건가요?
아항~ 그러셨군요 축하드려요!! +_+ 이미 해결하신것 같지만
제 말은 update_info() 안에서 listdb 를 수정하고 adapter.notifyDataSetChanged(); 를 호출해 어댑터를 새로고침하게 하셨잖아요? 그런데 어댑터에 붙인 건 데이터베이스가 아니라 arrList 라는 배열이니까 arrList 에 업데이트한 데이터베이스 정보를 다시 씌워야 의미가 있다는 거지요. 예상으로는 onCreate 안에만 데이터베이스로부터 arrList 에 정보를 받아와서 어댑터에 붙이기 때문에 안됬던거라고 생각되네요.
+1 추천

제 생각을 정리하자면 요렇게 되는 것 같아용 '-'

초보개발자ㅠ (33,870 포인트) 님이 2014년 3월 11일 답변
헠 ㅠㅠ 친절한 답변 감사합니다..아침부터 감동의 물결이..
update_info(age);//새로 입력한 나이 값을 갖고 update_info로~
arrList.clear();
ArrayList arr2 = select_student();
for(int i=0; i < arr2 .size(); i++)
{
  arrList.add(arr2 .get(i).toString());
}
adapter.notifyDataSetChanged();

대략 이런식으로 만들었습니다.
위에서 말씀드린대로..update로 갱신[수정]된걸 바로 보기 위해 배열을 삭제하고 다시 넣었구요..ㅠㅠㅎㅎ;;
-
처음 listview에서 회원을 추가하고, 그 상태에서 바로 삭제 하면
배열 에러가 나더라구요. 위와같은 방법으로, 회원 추가 한 후, 바로 arrlist클리어하고 다시 나열하는 방식으로 하니, 에러는 안나고 바로 삭제가 되긴 하는데(정상적인 루트) 야매같아서 찜찜하네요..어쨌든 늘 도움 주셔서 감사드립니다 ㅠㅠ
음~ 요지는 DB와 리스트의 동기화인데
업데이트 할 때마다 리스트를 새로 갈아엎지마시고
간단하게(?) arrList.set() 함수로 해당 리스트를 변경만 해주시면 되겠어요!
좋은 하루 되세용!

요건 참고사이트? ㅋㅋ
http://www.cyworld.com/opploger/9672436
아하, 그런 방법이 ..!감사합니다 ^^!!
...