Program Tip

기계적 인조 인간.

programtip 2020. 12. 13. 10:28
반응형

기계적 인조 인간. 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()메서드도 얻을 수 있습니다.

참고 URL : https://stackoverflow.com/questions/12229817/android-how-does-notifydatasetchanged-method-and-listviews-work

반응형