notifyDataSetChanged () делает обновление списка и прокручивает подсказки назад

Я пытаюсь реализовать бесконечный список прокрутки, но когда я вызываю notifyDataSetChanged() весь список обновляется, тогда позиция прокрутки возвращается в начало.

Это нормальное поведение? как я могу просто добавить добавленные элементы без обновления и сохранить положение прокрутки?

Такое поведение ненормально. Не видя кода, я могу предложить следующее:

1) Вы не вызываете notifyDataSetChanged() из streamа пользовательского интерфейса. Правильный способ:

 runOnUiThread(new Runnable() { public void run() { adapter.notifyDataSetChanged(); } }); 

2) Вы случайно или не звоните в adapter.notifyDataSetInvalidated();

3) В адаптере вы переопределите adapter.notifyDataSetChanged(); метод и добавлена ​​инструкция, чтобы перейти наверх

4) Если вы используете список для заполнения адаптера – каждый раз вы добавляете новый список, так что настройки адаптера обновляются. Вы всегда должны указывать тот же список. Однако вы можете изменить его столько, сколько хотите. Если вы list.clear список, используйте list.clear вместо list = new ArrayList();

Вот пример моего адаптера:

 public class Adapter extends BaseAdapter { private Activity activity; private ArrayList> data; private static LayoutInflater inflater = null; public ImageLoader imageLoader; public MediaItemAdapter(Activity a, ArrayList> d) { activity = a; data = d; inflater = (LayoutInflater) activity .getSystemService(Context.LAYOUT_INFLATER_SERVICE); imageLoader = new ImageLoader(activity.getApplicationContext()); } public int getCount() { return data.size(); } public Object getItem(int position) { return position; } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { View vi = convertView; if (convertView == null) { vi = inflater.inflate(R.layout.item_composer, null); } TextView title = (TextView) vi.findViewById(R.id.item_title); // title TextView price = (TextView) vi.findViewById(R.id.price); return vi; } } 

Вызовите адаптер:

 List myList = new ArrayList>(); Adapter ma = new Adapter(this, myList); 

myList может быть пуст до инициализации адаптера.

Затем выполните некоторую операцию с моим списком:

 myList.add(someElement); ma.notifyDataSetChanged(); 

если вам нужно удалить все предметы:

 myList.clear(); ma.notifyDataSetChanged(); 

Такая реализация довольно бесконечна, я видел более 15 тысяч элементов без каких-либо проблем.

В моем случае проблема заключалась в том, что я вызывал ListView.setAdapter(adapter) каждый раз, когда были установлены новые данные, которые также сбросили позицию, а представление переместилось вверх.

Удаление избыточных setAdapter(...) исправлено для меня.

Вы можете сделать это по-другому, как это

 int position = scrollView.getSelectedItemPosition(); notifyDataSetChanged(); scrollView.setSelection(position); 

Если ваш адаптер подclassифицирует ArrayList то вызов adapter.clear() вызовет notifyDataSetChanged() результате чего позиция прокрутки будет потеряна. setNotifyOnChange(false) вызвать setNotifyOnChange(false) чтобы предотвратить это.

Более подробная информация здесь: https://stackoverflow.com/a/14719538/383761

  • Как я могу профилировать приложение для Android?
  • Разделить значение int на отдельные цифры
  • BroadcastReceiver для ACTION_MEDIA_BUTTON не работает
  • java.lang.IllegalMonitorStateException: объект не заблокирован streamом перед wait ()?
  • Как использовать векторные чертежи в Android API ниже 21?
  • Как избежать% в String.Format?
  • Вопрос о блокировке Java
  • Основной метод не найден, даже если я его объявил
  • Каковы все различные способы создания объекта в Java?
  • Можно использовать два classа Java с одинаковым именем и одним пакетом?
  • можно ли отключить клавиши Windows с помощью java
  • Давайте будем гением компьютера.