notifyDataSetChanged () hace que la lista se actualice y los saltos de desplazamiento vuelvan a la parte superior

Estoy tratando de implementar una lista de desplazamiento sin fin pero cuando notifyDataSetChanged() la lista completa se actualiza y la posición de desplazamiento vuelve a la parte superior.

¿Es este el comportamiento normal? ¿Cómo puedo hacer que simplemente agregue los elementos agregados sin actualizar y mantener la posición de desplazamiento?

Tal comportamiento no es normal. Sin ver tu código, puedo sugerir lo siguiente:

1) No está llamando a notifyDataSetChanged() desde el subproceso de interfaz de usuario. La forma correcta:

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

2) accidentalmente o no está haciendo una llamada a adapter.notifyDataSetInvalidated();

3) En su adaptador anula el adapter.notifyDataSetChanged(); método y la instrucción agregada para ir arriba

4) Si está utilizando una lista para completar el adaptador, siempre suministrará una nueva lista para que la configuración del adaptador se actualice. Siempre debe proporcionar la misma lista. Sin embargo, puedes cambiarlo tanto como quieras. Si está restableciendo la lista use list.clear lugar de list = new ArrayList();

Aquí hay un ejemplo de mi adaptador:

 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; } } 

Llame para el adaptador:

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

myList puede estar vacío antes de la inicialización del adaptador.

Luego haga alguna operación con mi lista:

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

si necesita eliminar todos los elementos:

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

Tal implementación es bastante interminable, vi más de 15 mil elementos sin ningún problema.

En mi caso, el problema era que estaba llamando a ListView.setAdapter(adapter) cada vez que se establecían nuevos datos que también restablecían la posición y la vista saltaba a la cima.

Eliminar las setAdapter(...) redundantes me lo arregló.

Puedes hacerlo de otra manera, así

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

Si su adaptador está subclasificando ArrayList , al llamar a adapter.clear() llamará a notifyDataSetChanged() y se perderá la posición de desplazamiento. Considere llamar a setNotifyOnChange(false) primero para evitar esto.

Más información aquí: https://stackoverflow.com/a/14719538/383761