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

android)listView 갱신 질문!!!

0 추천
현재 제가 구현 하고픈 부분은 리스트뷰가 일정시간마다 DB에서 값을 다시 불러옵니다.

헌데 DB값을 다시 불러왔을때 리스트뷰의 위치는 사용자가 보던 그 위치여야 합니다.

예를 들면 제가 리스트의 중간 쯤을 보고 잇었는데 DB에서 값을 다시 불러왔습니다.

그럼 다시 불러왓을때 바뀐 값이 있다면 제가 보고 있던 중간 부분에 변화가 없더라도

화면상에 보여지지 않는 그 윗부분이나 아랫부분에 DB에서 변경된 값이 있다면 바꿔주고 싶습니다.

일정시간마다 새로 통째로 불러서 다시 리스트에 붙이면 값이 갱신 되지만 리스트뷰가 항상 처음 위치로 돌아가더라구요...

요약:

1. DB를 일정 시간마다 불러옴(<- 여기는 구현됨)

2. 불러온 값을 리스트에 다시 붙이는데 현재 사용자가 보고 있는 리스트 화면은 유지 되어야함 (<- 이걸 구현하고픔)

 

구지 위처럼 안해도 다른 식으로 유사하게 구현할 수 잇는 방법이 있다면 알려주세요..ㅠㅠ

삽질해서 notifydatasetchanged()를 구현해 보았는데 다 하고 여러번 수정하고 그러다보니

그건 리스트에 새로운 값을 추가 할때만 추가된 값을 붙이는 형태더라구요..

이미 리스트에 붙어 있는 값들은 DB상에서 값이 변경되도 변하지도 않고..ㅠㅠ

cursoradapter나 cursorloader는 url이 뭔지도 모르겠고..

제발 도와주세요..ㅠㅠ
민트라떼 (370 포인트) 님이 2015년 1월 8일 질문

3개의 답변

+1 추천
모르겠다고 하지 마시고 제대로 공부하시기 바랍니다.

cursorloader를 사용하면 구현이 가능합니다.

그리고 notifydatasetchanged는 데이터가 추가된 경우나 있는 데이터가 업데이트된 경우 모두 제대로 동작합니다.
익명사용자 님이 2015년 1월 8일 답변
제대로라는 기준이 익명님께 어떤걸 말씀하시는지 모르겠지만
몇일을 계속 구글링하고 질문도 해보고 하는데도 이해가 잘안되서
부끄러움에도 질문을 남긴 겁니다..
cursorloader, adapter에서 제가 이해가 안되는건 예제들이 sqlitedatabase를 이용하여 테이블을 만들고 입력하고 수정하고 값을 불러온다는 겁니다.
저는 ms_sql디비에서 이미 만들어진 테이블에서 데이터를 가져오는데요..ㅠㅠ
그리고 제가 이해한게 맞는지는 모르겠으나 위에 적었다시피
notifydatasetchanged()는 리스트뷰상에서 값을 입력하거나 수정하면
리스트에 변화가 일어나는걸로 이해했는데요.
저는 리스트상(app)에서 입력하는 기능은 없고 DB에서 입력이 됬거나
수정됬으면 그 변화된 상태를 리스트(app)에 뿌려주려고 하거든요.
단순히 DB에서 변경된 값을 실시간으로 갱신하여 보여주는 기능입니다.
제가 notifydatasetchanged() 이해한게 틀린걸까요? ㅠㅠ
처음부터 잘하는사람이 어디있나...
같은말이라도 상당히 기분나쁘게 하시네
0 추천

현재 상태가

1. DB에서 데이터 읽음

2. 읽은 데이터를 ArrayList 등의 객체에 담음

3. 데이터를 담은 객체를 이용해 Adapter 생성

4. Adapter를 ListView에 setAdapter 하여 연결

이렇게 되어 있다고 했을 때,

사용자가 화면을 보고 있는 상태에서 DB를 새로 읽음

 

이 이후에 해야 할 일은

1. DB에서 읽은 데이터를 아까 생성했던 ArrayList 객체에 넣음

(넣기 전에 ArrayList를 clear 함수 같은 걸로 비워주세요.)


2. Adapter의 notifyDataSetChanged() 호출

이렇게 하면 현재 보고있는 상태로 리스트가 갱신됩니다.

가랑비 (10,530 포인트) 님이 2015년 1월 8일 답변
다시 리스트뷰에 어답터를 set하지 않고 그냥 다시 DB에서 읽은 데이터를 arraylist에 넣어주고 notifydata..ed()로 어답터 호출해주면 갱신이 되는건가요?
네 그렇습니다.
다시 setAdapter를 하면 리스트를 새로 구성해서
리스트의 처음이 보여지게 됩니다.
notifyDataSetChanged() 해야 현재 보던 화면 그대로
데이터 변경사항이 반영됩니다.
정말 감사드립니다 저도 같은 문제로 골머리썩고있었는데
해결했습니다 ^^
0 추천
http://stackoverflow.com/questions/3606530/listview-scroll-to-the-end-of-the-list-after-updating-the-list

ListView를 원하는 지점으로 보내는 방법 입니다.

이 방법 말고 ScrollTo를 이용해도 됩니다.
노예의집 (23,370 포인트) 님이 2015년 1월 8일 답변
이런 방법도 있네요.
하지만 저는 몇번째 위치라고 정해진게 아니라
데이터가 갱신 되기 전에 사용자가 보고 있던 위치로 가야하는거라서요.ㅠ.ㅠ
...