기계적 인조 인간. notifyDataSetChanged () 메서드와 ListView는 어떻게 작동합니까?
나는 ListView
개념과 그것이 어떻게 작동하는지 이해 하려고 노력하고 있으며 확장하는 내 자신의 어댑터를 만들려고합니다 BaseAdapter
. 의 경우 ArrayAdapter
예를 들어,이 notifyDataSetChanged()
사용자가 새로 고침하기 위해, 모든 데이터를 보유하고있는 배열 목록을 업데이트 한 후에 호출 할 필요가 방법 ListView
.
하지만 내 자신의 하위 클래스를 만들고 BaseAdapter
있습니다. 이 방법을 사용할 수 없습니까? 이 방법을 어떻게 구현합니까? 기본적으로 그 방법이 정확히 무엇을하는지 이해할 수있을 것입니다.
의 경우 현재 표시 ArrayAdapter
되는 위치를보고 업데이트 된 후의 위치 ListView
와 동일한 지 확인합니다 ArrayList
. 또는...
방법은 다음과 같습니다.
연결된 관찰자에게 기본 데이터가 변경되었으며 데이터 세트를 반영하는 모든보기가 자체적으로 새로 고쳐 져야 함을 알립니다.
하지만 정확히 어떻게 자체적으로 새로 고침됩니까?
누군가 설명해 주시겠습니까?
나는 그것을 알아 냈다 . 어댑터가 어떻게 시작되었는지, 데이터를 가져올 위치를 어떻게 알 수 있는지 이해할 수 없었습니다. BaseAdapter
클래스를 확장 할 때 해당 클래스의 생성자에서 ListView
. 그러나 이러한 값이 언제 어떻게 사용되는지 알 수 없었습니다.
그래서 여기에 문제가 있습니다 !!! :
에는 BaseAdapter
재정의해야하는 몇 가지 메서드가 있습니다. 이 중 getCount()
.
ListView
가 생성 되면 getCount()
. 이것이 0이 아닌 값을 반환하면 (이전에 생성자에서 초기화 한 ArrayList의 크기를 반환 했음), getView()
화면을 항목으로 채울만큼 충분한 시간을 호출 합니다. 예를 들어ArrayList
20 개 항목으로 초기화했습니다 . 처음에는 8 개 항목 만 화면에 표시 되었기 때문에 getView()
8 번 호출 되었기 때문에 반환하는 데 필요한 위치를 물을 때마다 (더 정확하게는 특정 위치의 목록에서 행이 어떻게 보이는지 알고 싶었습니다. 포함해야 함). 목록을 아래로 스크롤하면 목록 getView()
끝에 도달 할 때까지 계속해서 호출됩니다. 제 경우에는 20 개 항목 / 행입니다.
무엇을 notifyDataSetChanged()
하는지 ... 호출 될 때, 호출시 화면에 표시되는 항목 (보다 정확하게는 어떤 행 인덱스) getView()
을보고 해당 위치로 호출합니다 .
즉 , 목록에서 처음 8 개 항목을 표시하고 (그러므로 화면에 표시되는 항목 임) 목록의 두 번째 항목과 세 번째 항목 사이에 다른 항목을 추가 notifyDataSetChanged()
한 다음 getView()
호출이 8 번 호출되고 위치가 시작되는 경우 0에서 7로 끝나고 getView()
메소드에서 데이터를 가져 오기 때문에 ArrayList
이전 8 중 7과 함께 목록에 삽입 된 새 항목을 자동으로 반환합니다 (마지막 항목이 한 위치에 갔기 때문에 8이 아닌 7 아래로 내려 가면 더 이상 표시되지 않음) 및 ListView
이러한 항목으로 다시 그려집니다.
또한 지정해야 할 중요한 것은 getView()
올바르게 구현 한 경우 이미 표시된 항목 (객체)을 새로 만드는 대신 재활용하게 된다는 것입니다. 참고 이 비디오를 구현하는 올바른 방법을보고 주위 12시 분을getView()
나는 LogCat
모든 메소드에서 호출을 하고 무슨 일이 일어나고 있는지를 따라이 모든 것을 알아 냈다 .
이것이 어떻게 ListView
작동 하는지 이해하기 시작한 사람에게 도움이되기를 바랍니다 .
추신 이 예 는 또한 저를 이해하는 데 많은 도움 이 되었습니다.
최신 정보
요즘 ListViews
은 더 이상 실제로 사용되지 않습니다. 안드로이드는 함께 나온 RecyclerView
당신에 대한 전망의 재활용,하지만의 기본을 알고을 수행하는이 ListView
을 이해하는 데 도움이 RecyclerView
.
참조 링크 : https://developer.android.com/guide/topics/ui/layout/recyclerview
BaseAdapter
다른 클래스에서 "관찰"할 수 있습니다. 메서드를 호출 할 때 어댑터 ListView
setAdapter()
호출 registerDataSetObserver
입니다. 따라서 어댑터는 새 데이터에 관심이있는 사람을 알고 있습니다.
BaseAdapter
여기 에서 소스를 확인할 수 있습니다 . 꽤 작습니다.
notifyDataSetChanged
입니다 당신을 위해 가능하면 (그것은 아무것도 특별 안하고 있기 때문에 당신이 당신 자신의 클래스를 재사용 할 수 있도록)을 오버라이드 (override)하지 말아야 기본적입니다.
당신의 가정 ListView
표시하는에 저장된 일부 데이터를 ArrayList
.
의 내용을 변경 한 후에 ArrayList
는 데이터 소스가 변경되었으며 새 데이터를 표시하기 위해 자체적으로 다시 그려야 함을 목록에 알려야합니다.
그래서 notifyDatasetChanged()
그것이 들어오는 곳 입니다. 그것은 ListView
데이터가 수정되었음을 알려줍니다 . 새 데이터를 표시 ListView
하려면을 다시 그려야합니다.
BaseAdapter
하위 클래스를 만들기 위해 자신을 확장 하면 notifyDataSetChanged()
메서드도 얻을 수 있습니다.
'Program Tip' 카테고리의 다른 글
Python에서 ROC 곡선을 그리는 방법 (0) | 2020.12.13 |
---|---|
파이썬, 왜 elif 키워드일까요? (0) | 2020.12.13 |
PHP를 사용하여 mysql 데이터베이스에서 .sql 파일을 가져 오는 방법 (0) | 2020.12.13 |
AngularJS UI-Router : 매개 변수로 상태의 절대 URL 가져 오기 (0) | 2020.12.13 |
IIS의 ASP.NET MVC3 및 Windows Auth가 계속 / Account / Login으로 리디렉션됩니다. (0) | 2020.12.13 |