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

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

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

Solutions Collecting From Web of "NotifyDataSetChanged () обновляет список и прокручивает подсказки назад"

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

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

 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<HashMap<String, String>> data; private static LayoutInflater inflater = null; public ImageLoader imageLoader; public MediaItemAdapter(Activity a, ArrayList<HashMap<String, String>> 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<HashMap<String, String>>(); Adapter ma = new Adapter(this, myList); 

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

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

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

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

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

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

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

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

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

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

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

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

Ниже код работал для меня,

 recyclerView.setHasFixedSize(true);