estoy trasladar mi adaptador en RecyclerView.Adapter

lo que quiero lograr:
cuando el usuario se desplaza hacia abajo cerca del final quiero empezar a capturar los datos, también quiero añadir que me ProgressBar ver al final para que el usuario sepa más datos de lo que está por venir.

la forma en que he implementado en mi BaseAdapter: en getView en la vista solicitada en cerca del final, que iba a empezar a ir a buscar más datos, llame a notifyDataSetChanged (para obtener el ProgressBar vista para mostrar) y sólo entonces devolver la visión necesarios paragetView.

lo que he intentado hacer en RecyclerView.Adaptador: traté de hacer lo mismo básicamente, esta vez en el método de onBindViewHolder,

pero si intento llamar notifyItemInserted dentro de este método me sale el siguiente excepción:

IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling

lo que he intentado: me di cuenta de que onBindViewHolder se llama desde onLayoutChildren de LayoutManager, traté de invalidándolo y llamadas notifyItemInserted después de su super pero tengo el mismo excepción

¿cómo puedo lograr mi objetivo?

  • uso LinearLayoutManager para este trabajo
  • se podría escribir un ejemplo?, yo no podía hacer esto sin llegar a esta excepción
  • reemplazar onScrollStateChanged, aquí el uso de findLastVisibleItemPosition para comprobar que están en la parte inferior y la actualización de su Adaptador
  • por cierto que dond necesidad de subclase LinearLayoutManager, el mismo que se puede hacer con RecyclrView.OnScrollListener
  • lo probé y funciona, pero la actualización sólo se inicia cuando el usuario termine el libro y no tengo ese perfecta de desplazamiento como la que tenía antes de RecyclerView
  • a fin de utilizar RecyclerView.OnScrollListener.onScrolled, en lugar de RecyclerView.OnScrollListener.onScrollStateChanged
  • hizo RecyclerView.OnScrollListener.onScrolled trabajo?
  • es sorta trabajado, que terminó siendo otra excepción que no estoy seguro es relativa, terminé abandonando RecyclerView porque creo que la implementación actual de StaggeredGridViewLayout no es muy estable en el momento

InformationsquelleAutor user1333057 | 2014-10-24

6 Comentarios

  1. 44
            Handler handler = new Handler();
    
            final Runnable r = new Runnable() {
                public void run() {
                    adapter.notifyDataSetChanged();
                }
            };
    
            handler.post(r);

    Mi código de ejemplo donde yo llame adaptador.notifyDataSetChanged(); a partir de la Actividad

    • Omg que me ha ayudado mucho. Pero este proceso requiere de una capacidad o es ineficiente?
    • No sé que tanto.
    • esto funciona, gracias. No me han actualizado a la nueva biblioteca de soporte.
    • pero no me deja crear el controlador de objeto debido a su abstracción 🙁
    • por favor, eche un vistazo a mi siguiente fragmento de código para su caso.
    • Ahh encontrar la razón.Yo era la importación de clase incorrecta
    • Desguace o adjunto vistas no pueden ser reciclados. isScrap:false isAttached:true =(

  2. 20

    También vale la pena destacar el JavaDoc en el RecyclerView.isComputingLayout() método que desencadena esta excepción :

    /**
     * Returns whether RecyclerView is currently computing a layout.
     * <p>
     * If this method returns true, it means that RecyclerView is in a lockdown state and any
     * attempt to update adapter contents will result in an exception because adapter contents
     * cannot be changed while RecyclerView is trying to compute the layout.
     * <p>
     * It is very unlikely that your code will be running during this state as it is
     * called by the framework when a layout traversal happens or RecyclerView starts to scroll
     * in response to system events (touch, accessibility etc).
     * <p>
     * This case may happen if you have some custom logic to change adapter contents in
     * response to a View callback (e.g. focus change callback) which might be triggered during a
     * layout calculation. In these cases, you should just postpone the change using a Handler or a
     * similar mechanism.
     *
     * @return <code>true</code> if RecyclerView is currently computing a layout, <code>false</code>
     *         otherwise
     */
    public boolean isComputingLayout() {
        return mLayoutOrScrollCounter > 0;
    }

    Las principales frase ser :

    En estos casos, sólo debe posponer el cambio a través de un Controlador o una
    mecanismo similar.

    En mi caso, yo estaba modificando el adaptador de contenido de otro hilo, lo que fue (en ocasiones) de la causa de una colisión. El desplazamiento de la actualización de un Controlador en el subproceso de interfaz de usuario de forma natural resuelve esto.

  3. 9

    El uso de un Handler para añadir elementos y llamando notify...() de este Handler solucionado el problema para mí.

    • Esa es la respuesta correcta, usted no puede cambiar la pieza durante la configuración (con llamadas onBindViewHolder). En ese caso, usted tiene que llamar a notifyItemInserted al final del bucle actual llamando al Controlador.post()
  4. 5

    Limpio y fácil manera:

      recyclerView.post(new Runnable() {
                        @Override
                        public void run() {
                            adapter.notifyDataSetChanged();
                        }
                    });

    Explicación: use su RecyclerView instancia y dentro del método post una nueva Runnable añadido a la cola de mensajes. El ejecutable se ejecuta en el subproceso de interfaz de usuario. Este es un límite para Android para acceder a la interfaz de usuario subproceso de fondo (por ejemplo, dentro de un método que se ejecutará en un subproceso en segundo plano).

  5. 0

    Yo uso este:

    Handler handler = new Handler();
    private void notifyItemInsertedEx(final int position) {
        try {
            notifyItemInserted(position);
        } catch (Exception ex) {
            handler.post(new Runnable(){
                public void run(){
                    notifyItemInserted(position);
                }
            });
        }
    }

Dejar respuesta

Please enter your comment!
Please enter your name here