notifyDataSetChanged пример
Я пытаюсь использовать в своей Android Application
на notifyDataSetChanged()
метод ArrayAdapter
но это не работает для меня.
нашел ответ тут, что notifyDataSetChanged()
должен выполняться в основном потоке, но для этого не было примера.
кто-нибудь может прислать пример или хотя бы ссылку?!
5 ответов
на ArrayAdapter
, notifyDataSetChanged
работает только при использовании add()
, insert()
, remove()
и clear()
на адаптере.
когда ArrayAdapter
построен, он содержит ссылку для List
это было передано. Если вы пройдете в List
это был член активности, и измените этот член активности позже,ArrayAdapter
все еще держит ссылку на оригинал List
. Адаптер не знает, что вы изменили List
в Деятельность.
ваш выбор:
- использование функции
ArrayAdapter
для изменения списка (add()
,insert()
,remove()
,clear()
, etc.) - воссоздать
ArrayAdapter
новаяList
данные. (Использует много ресурсов и сбор мусора.) - создать свой собственный класс, производный от
BaseAdapter
иListAdapter
это позволяет изменять базовоеList
структуры данных. - использовать
notifyDataSetChanged()
каждый раз список обновляется. Чтобы вызвать его в UI-потоке, используйтеrunOnUiThread()
ofActivity
. Затем:notifyDataSetChanged()
будет работать.
можно использовать runOnUiThread()
метод следующим образом. Если вы не используете ListActivity
, просто адаптируйте код, чтобы получить ссылку на ваш ArrayAdapter
.
final ArrayAdapter adapter = ((ArrayAdapter)getListAdapter());
runOnUiThread(new Runnable() {
public void run() {
adapter.notifyDataSetChanged();
}
});
Я недавно написал на эту тему, хотя этот пост старый, я думал, что это будет полезно для тех, кто хочет знать, как реализовать BaseAdapter.notifyDataSetChanged()
шаг за шагом, и правильно.
пожалуйста Как правильно реализовать BaseAdapter.notifyDataSetChanged() в Android или новый блог BaseAdapter.notifyDataSetChanged().
у меня была та же проблема, и я предпочитаю не заменять весь ArrayAdapter новым экземпляром непрерывно. Таким образом, у меня есть AdapterHelper, который делает тяжелый подъем где-то еще.
добавьте это, где вы обычно (попробуйте) вызовите notify
new AdapterHelper().update((ArrayAdapter)adapter, new ArrayList<Object>(yourArrayList));
adapter.notifyDataSetChanged();
класс AdapterHelper
public class AdapterHelper {
@SuppressWarnings({ "rawtypes", "unchecked" })
public void update(ArrayAdapter arrayAdapter, ArrayList<Object> listOfObject){
arrayAdapter.clear();
for (Object object : listOfObject){
arrayAdapter.add(object);
}
}
}
Я знаю, что это поздний ответ, но я столкнулся с аналогичной проблемой, и мне удалось решить ее с помощью notifyDataSetChanged()
в нужном месте.
Итак, моя ситуация была следующей.
мне пришлось обновить listview на вкладке панели действий (фрагмент) с содержимым, возвращенным из совершенно другого действия. Однако первоначально listview не будет отражать никаких изменений. Однако, когда я щелкнул другую вкладку, а затем вернулся на нужную вкладку, listview будет обновлен с помощью правильное содержание из другой деятельности. Поэтому для решения этой проблемы я использовал notifyDataSetChanged()
адаптера панели действий в коде действия, который должен был вернуть данные.
Это фрагмент кода, который я использовал в работе.
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId())
{
case R.id.action_new_forward:
FragmentTab2.mListAdapter.notifyDataSetChanged();//this updates the adapter in my action bar tab
Intent ina = new Intent(getApplicationContext(), MainActivity.class);
ina.putExtra("stra", values1);
startActivity(ina);// This is the code to start the parent activity of my action bar tab(fragment).
}
}
это действие вернет некоторые данные в FragmentTab2
и он будет напрямую обновлять мой listview в FragmentTab2
.
надеюсь, кто-то найдет это полезным!