2011-05-05 9 views
30

Android tiene transcript mode para permitir desplazar automáticamente una vista de lista hacia abajo cuando se agregan datos nuevos al adaptador.¿Agregar nuevos elementos a la vista superior de la lista en Android?

Puede ser esto de algún modo invertido, de manera que los nuevos elementos se añaden automáticamente en la parte superior de la lista ("modo de transcripción inversa")

Método stackFromBottom parece correcto, pero no hace el desplazamiento automático de 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í?

actualización

Gracias por las respuestas, que 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.

+1

lo quieres a 'scroll' (suave o de otro tipo) o simplemente desea que salte/quedarse con el último elemento añadido como el primer elemento (superior) en la lista. Si es el segundo comportamiento que desea, simplemente llame al método ListView 'setSelection (0)' después de agregar un nuevo elemento en el índice 0 en su adaptador. – Squonk

Respuesta

42

Hmm, bueno, si iba a probar esto, yo 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 sé con certeza que esto va a funcionar, 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).

+0

esto no funciona –

+0

No obtengo lo que son 'elementos' y ¿qué es 'objectList'? –

+0

Esto funcionó para mí 'items.add (0, obj); listAdapter.notifyDataSetChanged(); 'pero no la 3º línea del ciclo:' listView.scrollTo (0, 0); ' –

7

¿No debería ser suficiente agregar un smoothScrollToPosition(0) cada vez que se agrega material al ListView? No creo que haya una opción de desplazamiento automático.

+0

(Tenga en cuenta que el modo de transcripción se desplaza inmediatamente en lugar de hacerlo sin problemas) –

+0

Bueno, podría usar 'scrollTo' si lo cree firmemente. – Femi

7

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 añadieron los artículos antepuesto.

En el momento en que haces una notifyDataSetChanged, el ListView se colocará automáticamente en el primer elemento del conjunto de datos y no en la posición que precedió a la posición en la que consiguieron insertan los nuevos artículos.

Esto hace que parezca que su lista acaba de saltar 50 o 100 registros. Creo que TranscriptMode establecido en normal 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".

2

Intente utilizar

LinkedList items = new LinkedList<Object>(); 

//some fictitious objectList where we're populating data 
for(Object obj : objectList) { 
    items.addFirst(obj); 
} 
listAdapter.notifyDataSetChanged(); 
+0

No use LinkedList para leer datos, porque LinkedList es más lento que ArrayList para leer datos, pero LinkedList es más rápido para agregar datos en la lista. – GeneralKimi

8

en lugar de esto:

items.add(edittext.getText().toString()); 
adapter.notifyDataSetChanged(); 

usted debe tratar de que (funciona para mí):

listview.post(new Runnable() { 
      @Override 
      public void run() { 
       items.add(0, edittext.getText().toString()); 
       adapter.notifyDataSetChanged(); 
       listview.smoothScrollToPosition(0); 
      } 
      }); 
+1

Thumps up for you man .. –

+1

Perdóneme por hacer una pregunta ingenua, pero ¿cómo esta solución es mejor que la respuesta aceptada? – Darpan

2

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); 
     ... 
0

usted debe tratar de que (posición de la lista y actualizar adaptador)

list.add(0,editTextSName.getText().toString()); 
adapter.notifyDataSetChanged(); 
Cuestiones relacionadas