programacion - ¿Agregar nuevos elementos a la vista superior de la lista en Android?
manual de programacion android pdf (7)
Android tiene el modo de transcripción para permitir desplazar automáticamente una vista de lista hacia abajo cuando se agregan nuevos datos al adaptador.
¿Se puede revertir de alguna manera para que los nuevos elementos se agreguen automáticamente en la parte superior de la lista ("modo de transcripción inversa")?
El método stackFromBottom parece correcto, pero no hace el desplazamiento automático en el cambio de entrada.
¿Alguien tiene algún código de ejemplo donde una lista constantemente agrega cosas que siempre se insertan en la parte superior? ¿Estoy en el camino correcto aquí?
Actualizar
Gracias por las respuestas, eso me hizo pensar más. Actualmente. Quiero que aparezcan nuevas entradas en la parte superior, pero la pantalla aún muestra el elemento que está mirando el usuario. El usuario debe desplazarse activamente hacia la parte superior para ver los nuevos elementos. Así que supongo que ese modo de transcripción no es lo que quiero.
¿No debería ser suficiente simplemente agregar un smoothScrollToPosition(0)
cada vez que se agrega material al ListView? No creo que haya una opción de desplazamiento automático.
Esto resuelve el problema:
...
ListView lv;
ArrayAdapter<String> adapter;
ArrayList<String> aList;
...
lv = (ListView) findViewById(R.id.mylist);
aList = new ArrayList<String>();
adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_spinner_item, aList);
lv.setAdapter(aAdapter);
...
adapter.insert ("Some Text 1", 0);
adapter.insert ("Some Text 2", 0);
adapter.insert ("Some Text 3", 0);
...
Hmm, bueno, si tuviera que probar esto, haría algo como lo siguiente:
List items = new ArrayList();
//some fictitious objectList where we''re populating data
for(Object obj : objectList) {
items.add(0, obj);
listAdapter.notifyDataSetChanged();
}
listView.post(new Runnable() {
@Override
public void run() {
listView.smoothScrollToPosition(0);
}
}
No estoy seguro de que esto funcione, pero parece lógico. Básicamente, solo asegúrese de agregar el elemento al principio de la lista (posición 0), actualice el adaptador de lista y desplácese a la posición (0, 0).
Pasé varias horas intentando lograr lo mismo. Esencialmente, esto actúa como una aplicación de chat donde el usuario se desplaza hacia arriba para ver los mensajes más antiguos en la parte superior de la lista.
El problema es que desea agregar dinámicamente otros 50 o 100 registros a la parte superior, pero el desplazamiento debe ser continuo desde donde se agregaron los elementos antepuestos.
En el momento en que realice un notifyDataSetChanged
, el ListView se posicionará automáticamente en el primer elemento de su conjunto de datos y NO en la posición que precedió a la posición donde se insertaron los nuevos elementos.
Esto hace que parezca que su lista acaba de saltar 50 o 100 registros. Creo que TranscriptMode establecido en la normalidad no es la solución . La vista de lista debe funcionar como una vista de lista normal y debe desplazarse hacia la parte inferior de la lista para simular el TranscriptMode, ya que funciona bajo "normal".
Tratar de usar
LinkedList items = new LinkedList<Object>();
//some fictitious objectList where we''re populating data
for(Object obj : objectList) {
items.addFirst(obj);
}
listAdapter.notifyDataSetChanged();
deberías probar eso (posición de la lista y adaptador de actualización)
list.add(0,editTextSName.getText().toString());
adapter.notifyDataSetChanged();
en lugar de esto:
items.add(edittext.getText().toString());
adapter.notifyDataSetChanged();
deberías probar eso (funciona para mí):
listview.post(new Runnable() {
@Override
public void run() {
items.add(0, edittext.getText().toString());
adapter.notifyDataSetChanged();
listview.smoothScrollToPosition(0);
}
});