2011-04-02 22 views
5

He estado jugando mucho con un problema que he tenido. Lo que sucede es que cada vez que se agrega un elemento a mi lista de lista (adaptador), espero que se desplace automáticamente si estoy en el último elemento (lo cual hará hasta cierto punto); SIN EMBARGO, si se agregan 3 o más elementos a la vez, no se desplazará automáticamente.¿Por qué android: transcriptMode = "normal" no funciona correctamente?

Aquí es el XML de esa vista de lista:

<ListView android:id="@android:id/list" 
    android:layout_width="fill_parent" 
    android:layout_height="0dip" 
    android:layout_weight="1" 
    android:transcriptMode="normal"/> 

que intentaron una solución usando un fragmento encontré here.

Mi código es el siguiente:

public void addChat(final String text, final String username) { 
    this.runOnUiThread(new Runnable() { 
     public void run() { 
      globals.chatAdapter.add(DateFormat.format("hh:mmaa", Calendar.getInstance()).toString(), username, text); 

      globals.chatAdapter.notifyDataSetChanged(); 

      int lastP = getListView().getLastVisiblePosition(); 
      int count = globals.chatAdapter.getCount() - 1; 

      if (lastP == globals.chatAdapter.oldP || lastP == -1) { 
       getListView().setSelection(count); 
      } 

      globals.chatAdapter.oldP = count; 
     } 
    }); 
} 

El problema con esto es cuando un grupo de artículos vienen en una vez, getListView() getLastVisiblePosition() no se actualizará de inmediato causando una setSelection() a. nunca se llama, y ​​por lo tanto no se desplaza automáticamente.

¿Alguna sugerencia?

Respuesta

9

Como solución, modifiqué el oyente de desplazamiento ... un poco crudo, pero hace el trabajo bien.

antiguo código - NUEVO CÓDIGO encontrado después EDITAR LA SIGUIENTE

this.getListView().setOnScrollListener(new OnScrollListener() { 
     public void onScroll(AbsListView view, int first, int visible, int total) { 
      if (visible == 0 || visible < total && (first + visible == total) || (getListView().getTranscriptMode() == 2) && (first + visible == total)) { 
       if (getListView().getTranscriptMode() != 2) 
        getListView().setTranscriptMode(2); 
      } else { 
       if (getListView().getTranscriptMode() != 0) 
        getListView().setTranscriptMode(0); 
      } 
     } 

     public void onScrollStateChanged(AbsListView view, int scrollState) {} 
    }); 

EDITAR 6/6/11:

seguí adelante y lo modificó de nuevo como me encontré con un error de interfaz de usuario en mi propia implementación (la captura de la inicial al fondo no se mantendría después de eliminar mi configuración xml de AlwaysScroll). Voy a dejar el código anterior, pero esto es lo que estoy usando ahora:

 getListView().setOnScrollListener(new OnScrollListener() { 
      public void onScroll(AbsListView view, int first, int visible, int total) { 
        if (visible == 0 || visible == total || (first + visible == total) { 
         if (getListView().getTranscriptMode() != AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL) 
          getListView().setTranscriptMode(AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL); 
        } else { 
         if (getListView().getTranscriptMode() != AbsListView.TRANSCRIPT_MODE_DISABLED) 
          getListView().setTranscriptMode(AbsListView.TRANSCRIPT_MODE_DISABLED); 
        } 
      } 

      public void onScrollStateChanged(AbsListView view, int scrollState) {} 
     }); 
+0

Hola, gracias por esto, yo estaba teniendo el mismo problema y esto lo arreglaron :) Una pregunta rápida, qué dejó ningún ajuste en su transcriptMode XML? –

+0

Para el código que está etiquetado como "CÓDIGO VIEJO" agregué una configuración de TranscriptMode en el XML, pero para el código después de la edición no lo hice. (Es por eso que cambié el código para eliminar mi configuración inicial de XML) – BCS

-2

Hay una solución más simple.

lv.setTranscriptMode (AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);

Aparentemente, esto debe hacerse en el código. No pude encontrar una forma de establecer TRANSCRIPT_MODE_ALWAYS_SCROLL en el archivo de diseño.

+2

Si bien esto funciona, no es el comportamiento previsto. Quiero que se desplace solo cuando se muestre el último elemento en la pantalla. Si el usuario se desplaza hacia arriba, no quiero que la vista se restablezca al final de la lista (de ahí la solución). – BCS

-3

o en el diseño de XML,

android:transcriptMode="alwaysScroll" 
Cuestiones relacionadas