- Как использовать notifyDataSetChanged
- The Developer World Is Yours
- The best place for Magento & Android tips and tricks… and much more!
- notifyDataSetChanged() – Android Example [Updated]
- notifyDataSetChanged() example:
- How to implement notifyDataSetChanged
- Андроид. Как работает метод notifyDataSetChanged () и ListViews?
- 4 ответов
- Андроид. Как работает метод notifyDataSetChanged () и ListViews?
- 4 ответов:
- Android. Как работает метод notifyDataSetChanged () и ListViews?
Как использовать notifyDataSetChanged
Мой проект упрощается, как показано ниже: Во-первых, я использую метод Data.java для сохранения данных. Он содержит данные:
Мой класс AActivity onCreate, как показано ниже:
И когда кнопка нажата, startActivity класс BActivity. В классе BActivity приведен код ниже:
Класс AActivity onResume(), как показано ниже:
Но почему список не обновляется? Я подтверждаю, что данные сохранены.
Добавьте новые данные непосредственно к адаптеру не в ‘d’. Адаптер сохраняет свои внутренние данные, что означает, что любые изменения, которые вы применяете к вашему “d”, не влияют на адаптер.
вам нужно иметь дело непосредственно с адаптером:
Вы не можете получить доступ к notifyDataSetChanged как статический метод
(это то, что вы делаете в своем примере).
Если у вас есть ListActivity: у вас есть доступ к методу getListAdapter().
Это правильная ссылка на ваш набор данных.
будет делать трюк. Если у вас нет ListActivity, вам нужно будет найти свой список через View.findViewById([id of listview]) и получить там адаптер.
Надеюсь это немного поможет 🙂
Я думаю, ваша проблема в том, что ваш DataAdapter ссылается на test массива, но test никогда не меняется. Ссылка на data в DataAdapter вместо test должна работать.
Хорошо, посмотрев на код Adapter он не сработает. Почему вы копируете свои данные? Адаптер никогда не заметит изменения в элементе data , поскольку он работает только с копией этого элемента во время построения. Если копирование data необходимо, вы должны убедиться, что адаптер также обновляет его содержимое.
Источник
The Developer World Is Yours
The best place for Magento & Android tips and tricks… and much more!
notifyDataSetChanged() – Android Example [Updated]
notifyDataSetChanged() example:
This android function notifies the attached observers that the underlying data has been changed and any View reflecting the data set should refresh itself.
You can use notifyDataSetChanged ArrayAdapter, but it only works if you use the add(), insert(), remove(), and clear() on the Adapter.
When an ArrayAdapter or BaseAdapter are constructed, it holds the reference for the List that was passed in. If you were to pass in a List that was a member of an Activity, and change that Activity member later, the ArrayAdapter is still holding a reference to the original List. The Adapter does not know you changed the List in the Activity.
How to implement notifyDataSetChanged
Your choices are:
Use the functions of the ArrayAdapter to modify the underlying List (add(), insert(), remove(), clear(), etc.)
Re-create the ArrayAdapter with the new List data. (Uses a lot of resources and garbage collection.)
Create your own class derived from BaseAdapter and ListAdapter that allows changing of the underlying List data structure.
Use the notifyDataSetChanged() every time the list is updated. To call it on the UI-Thread, use the runOnUiThread() of Activity. Then, notifyDataSetChanged() will work.
Multiple choice in listView
You need:
Interface
Data (String text, boolean selected)
Adapter
Fragment or Activity (calling notifyDataSetChanged custom adapter)
list_item.xml
You can start with data:
In your fragment or activity:
You can download the source code of this example in github.
If you have any questions about the usage of notifyDataSetChanged leave a comment below and we’ll try to help you.
Источник
Андроид. Как работает метод notifyDataSetChanged () и ListViews?
Я пытаюсь понять ListView концепция и как она работает, и я пытаюсь создать свой собственный адаптер, который расширяет BaseAdapter . Для ArrayAdapter например, есть notifyDataSetChanged() метод, который должен быть вызван после обновления списка массивов, который содержит все ваши данные, чтобы обновить ListView .
но я создаю свой собственный подкласс BaseAdapter . Этот метод мне недоступен или нет? Как реализовать этот метод? В принципе, что делает этот метод вот именно, может быть, тогда я пойму.
в случае ArrayAdapter Я предполагаю, что он смотрит на какую позицию ListView в настоящее время отображается, и он проверяет, является ли он таким же, как в ArrayList после того, как он был обновлен? Или.
в нем говорится, что метод:
уведомляет прикрепленных наблюдателей о том, что базовые данные изменено, и любое представление, отражающее набор данных, должно обновиться.
но как именно это происходит обновить себя?
может кто-нибудь объяснить, пожалуйста?
4 ответов
я понял. Я не мог понять, как, черт возьми, начался адаптер и как он узнал, откуда получить данные. Когда я расширил BaseAdapter класс, в конструкторе этого класса я инициализировал список элементов, которые я хотел видеть в ListView . Но я не мог понять, как эти значения будут использоваться и когда.
так вот в чем дело . :
на BaseAdapter есть некоторые методы, которые должны быть переопределенный. Среди них есть getCount() .
когда ListView создается и еще много чего, он вызывает getCount() . Если это возвращает значение, отличное от 0 (я вернул размер ArrayList, который я ранее инициализировал в конструкторе), то он вызывает getView() достаточное количество раз, чтобы заполнить экран с элементами. например, я инициализировал ArrayList С 20 пунктов. Потому что только 8 предметов изначально помещаются на экране, getView() был вызван 8 раз, каждый раз спрашивая позиция, которую мне нужно было вернуть (точнее, он хотел знать, как строка будет выглядеть в списке на этой конкретной позиции, какие данные она должна содержать). Если прокрутить список вниз, getView() вызывается снова и снова, пока я не достигну конца списка, в моем случае 20 элементов / строк.
что notifyDataSetChanged() делает . при вызове он смотрит, какие элементы отображаются на экране в момент его вызова (точнее, какие индексы строк ) и вызывает getView() с этими позициями.
то есть если вы отображаете первые 8 элементов в списке (так что это те, которые видны на экране), и вы добавляете другой элемент между 2-м и 3-м элементом в списке, и вы вызываете notifyDataSetChanged() затем getView() вызывается 8 раз, причем позиции начинаются с 0 и заканчиваются на 7, а потому в getView() метод вы получаете данные из ArrayList затем он автоматически вернет новый элемент, вставленный в список вместе с 7 из предыдущий 8 (7, а не 8, потому что последний элемент пошел на одну позицию вниз, поэтому он больше не виден), и ListView будет перерисовываться или что-то еще с этими элементами.
кроме того, важно указать, что если вы используете getView() правильно, вы закончите переработку элементов (объектов), уже отображаемых (вместо создания новых). См.видео около 12: 00 минут, чтобы увидеть правильный способ реализации getView()
я понял все это, сделав звонки в LogCat в каждом методе и после того, что происходило.
надеюсь, это поможет кому-то, кто только сейчас начинает понимать, как ListView s работа.
П. С. также помогли мне многое понять.
BaseAdapter может «наблюдаться» другими классами. Когда вы вызываете метод ListView это registerDataSetObserver адаптер. Таким образом, адаптер знает, кто заинтересован в новых данных.
вы можете проверить источник BaseAdapter здесь. Он довольно маленький.
notifyDataSetChanged is доступно для вас, и вы в основном не должны переопределять его (потому что он не делает ничего особенного, поэтому вы можете просто использовать его в своем собственном классе).
Предположим ваш ListView отображает некоторые данные, хранящиеся в ArrayList .
после изменения содержание ArrayList , вам нужно сообщить списку, что источник данных изменился, и ему нужно перерисовать себя, чтобы показать новые данные.
вот здесь notifyDatasetChanged() приходит. Он говорит ListView , что данные были изменены; и чтобы показать новые данные, ListView должно быть переписано.
Как вы расширяете BaseAdapter для вашего собственного для создания подкласса вы получите notifyDataSetChanged() способ также.
Источник
Андроид. Как работает метод notifyDataSetChanged () и ListViews?
Я пытаюсь понять и как это работает, и я пытаюсь создать свой собственный адаптер, который расширяет BaseAdapter . Ибо ArrayAdapter например, есть notifyDataSetChanged() метод, который должен быть вызван после того, как вы обновили список массивов, который содержит все ваши данные, чтобы обновить ListView .
но я создаю свой собственный подкласс BaseAdapter . Этот метод мне недоступен, или нет? Как реализовать этот метод? В принципе, что делает этот метод именно, может быть, тогда я пойму.
в случае ArrayAdapter Я предполагаю, что он смотрит на какую позицию ListView в настоящее время отображается, и он проверяет, является ли он таким же, как в ArrayList после того, как он был обновлен? Или.
он говорит, что метод:
уведомляет прикрепленных наблюдателей о том, что базовые данные были изменено и любое представление, отражающее набор данных, должно обновиться.
но как именно это происходит обновить себя?
может кто-нибудь объяснить, пожалуйста?
4 ответов:
я понял. Я не мог понять, как, черт возьми, адаптер начал и как он знал, откуда взять данные. Когда я расширил BaseAdapter класс, в конструкторе этого класса я инициализировал список элементов, которые я хотел видеть в ListView . Но я не мог понять, как эти значения будут использоваться и когда.
так вот в чем дело . :
на BaseAdapter есть некоторые методы, которые должны быть переопределенный. Среди них есть getCount() .
когда ListView создается и еще много чего, он вызывает getCount() . Если это возвращает значение, отличное от 0 (я вернул размер ArrayList, который я ранее инициализировал в конструкторе), то он вызывает getView() достаточное количество раз, чтобы заполнить экран с элементами. например, я инициализировал ArrayList С 20 пунктов. Потому что только 8 предметов изначально помещаются на экране, getView() был вызван 8 раз, каждый раз прося позиция, которую он требовал для меня, чтобы вернуться (точнее, он хотел знать, как строка будет выглядеть в списке на этой конкретной позиции, какие данные она должна содержать). Если я прокручиваю список, getView() вызывается снова и снова, ’til я попал в конец списка, в моем случае 20 элементов / строк.
что notifyDataSetChanged() делает . при вызове он смотрит, какие элементы отображаются на экране в момент его вызова (точнее, какие индексы строк ) и вызывает getView() с этими позициями.
т. е. если вы показываете первые 8 элементов в списке (так что это те, которые видны на экране), и вы добавляете еще один элемент между 2-м и 3-м элементом в списке, и вы вызываете notifyDataSetChanged() затем getView() вызывается 8 раз, причем позиции начинаются от 0 и заканчиваются на 7, а потому в getView() метод вы получаете данные от ArrayList затем он автоматически вернет новый элемент, вставленный в список вместе с 7 из списка предыдущие 8 (7 и не 8, потому что последний элемент пошел на одну позицию вниз, поэтому он больше не виден), а ListView будет перерисовывать, или что-то еще, с этими элементами.
кроме того, важно указать, что если вы используете getView() правильно, вы в конечном итоге переработаете уже отображенные элементы (объекты) (вместо создания новых). Смотрите видео примерно в 12: 00 минут, чтобы увидеть правильный способ реализации getView()
я понял все это, сделав звонки LogCat в каждом методе и после того, что происходит.
надеюсь, это поможет кому-то, кто только сейчас начинает понимать, как ListView s работа.
П. С. также помогло мне многое понять.
BaseAdapter может «наблюдаться» другими классами. Когда вы вызываете метод ListView это registerDataSetObserver адаптер. Таким образом, адаптер знает, кто заинтересован в новых данных.
вы можете проверить источник BaseAdapter здесь. Он довольно маленький.
notifyDataSetChanged и доступно для вас, и вы в основном не должны переопределять его (потому что он не делает ничего особенного, поэтому вы можете просто использовать его в своем собственном классе).
Предположим ваш ListView отображает некоторые данные, хранящиеся в ArrayList .
после изменения содержимого ArrayList , вам нужно сообщить списку, что источник данных изменился, и ему нужно перерисовать себя, чтобы показать новые данные.
вот здесь notifyDatasetChanged() приходит. Это говорит ListView , что данные были изменены; и чтобы показать новые данные, ListView должно быть переписано.
Как вы расширяете BaseAdapter для вашего собственного для создания подкласса, вы получите notifyDataSetChanged() способ также.
Источник
Android. Как работает метод notifyDataSetChanged () и ListViews?
Я пытаюсь понять концепцию ListView и как она работает, и я пытаюсь создать собственный адаптер, который расширяет BaseAdapter . Например, для ArrayAdapter существует метод notifyDataSetChanged() который следует вызывать после обновления списка массивов, который содержит все ваши данные, чтобы обновить ListView .
Но я создаю свой собственный подкласс BaseAdapter . Этот метод недоступен мне, или он? Как реализовать этот метод? В принципе, что делает этот метод точно, может быть, я пойму тогда.
В случае ArrayAdapter я предполагаю, что он смотрит, в какой позиции ListView отображается в настоящее время, и проверяет, совпадает ли он с ArrayList после его обновления? Или…
В нем говорится, что метод:
Сообщает заинтересованным наблюдателям, что базовые данные были изменены, и любой вид, отражающий набор данных, должен обновиться.
Но как именно он обновляется?
Может ли кто-нибудь объяснить, пожалуйста?
Я понял это . Я не мог понять, как, черт возьми, появился адаптер и как он узнал, откуда взять данные. Когда я расширил класс BaseAdapter , в конструкторе этого класса я инициализировал список элементов, которые я хотел увидеть в ListView . Но я не мог понять, как эти ценности будут использоваться и когда.
Вот и все! :
В BaseAdapter есть некоторые методы, которые необходимо переопределить. Среди них есть getCount() .
Когда ListView создан и еще много чего, он вызывает getCount() . Если это возвращает значение, отличное от 0 (я вернул размер ArrayList, который я ранее инициализировал в конструкторе), то он вызывает getView() достаточно времени, чтобы заполнить экран элементами. Например , я инициализировал ArrayList с 20 элементами. Поскольку только 8 элементов первоначально поместились на экране, getView() был вызван 8 раз, каждый раз прося позицию, которую мне нужно было вернуть (точнее, он хотел знать, как строка будет выглядеть в списке на этой конкретной позиции , Какие данные он должен содержать). Если я getView() список вниз, getView() будет вызываться снова и снова, «пока я не getView() в конец списка, в моем случае 20 элементов / строк.
Что notifyDataSetChanged() делает … когда он вызывается, он смотрит, какие элементы отображаются на экране в момент его вызова (точнее, какие индексы строк) и вызывает getView() с этими позициями.
Т.е. если вы показываете первые 8 элементов в списке (так это те, которые видны на экране), и вы добавляете другой элемент между вторым и третьим элементами в списке, и вы вызываете notifyDataSetChanged() тогда getView() 8 раз, с позициями, начинающимися с 0 и заканчивающимися на 7, и потому что в getView() вы получаете данные из ArrayList тогда он автоматически возвращает новый элемент, вставленный в список, рядом с 7 из предыдущих 8 (7 А не 8, потому что последний элемент ушел на одну позицию вниз, поэтому он больше не виден), и ListView будет перерисовывать или что-то еще с этими элементами.
Также важно указать, что если вы правильно реализовали getView() , вы в конечном итоге переработаете объекты (объекты), которые уже были показаны (вместо создания новых). Посмотрите это видео около 12:00 минут, чтобы увидеть правильный способ реализации getView()
Я понял все это, поместив вызовы в LogCat во всех методах и после того, что происходило.
Надеюсь, это поможет кому-то, кто только начинает понимать, как работает ListView .
PS Этот пример также помог мне понять.
BaseAdapter можно «наблюдать» другими классами. Когда вы вызываете метод ListView setAdapter() это вызовы registerDataSetObserver адаптера. Итак, адаптер знает, кто интересуется новыми данными.
Здесь вы можете проверить источник BaseAdapter . Это довольно мало.
notifyDataSetChanged доступен для вас, и вы не должны его переопределять (потому что он не делает ничего особенного, поэтому вы можете просто повторно использовать его в своем классе).
Предположим, что ваш ListView отображает некоторые данные, хранящиеся в ArrayList .
После того, как вы измените содержимое ArrayList , вам нужно сообщить списку, что источник данных был изменен, и ему нужно перерисовать его, чтобы показать новые данные.
Таким образом, здесь notifyDatasetChanged() . Он сообщает ListView что данные были изменены; И чтобы показать новые данные, ListView должен быть перерисован.
Поскольку вы расширяете BaseAdapter самостоятельно для создания подкласса, вы также получите notifyDataSetChanged() .
Источник