Me extendida

RecyclerView.Adapter<RecyclerView.ViewHolder>

Y cuando me llamó:

mRecyclerView.getAdapter().notifyDataSetChanged();

No pasó nada.

La única manera de actualizar la vista es establecer de nuevo el adaptador (ver esta respuesta):

mRecyclerView.setAdapter(new MyAdapter(...));

Tengo dos problemas con esta solución:

  1. Puedo ver un parpadeo en la pantalla cuando me puse de nuevo el adaptador de
  2. El listview vuelve a la primera posición.

Alguna idea?

  • ¿Has probado a encapsular notifyDataSetChanged método en MyAdapter? Por ejemplo: Crear «myNotifyDataSetChanged» en MyAdapter y desde que llamar a este método.notifyDataSetChanged()». Guardar MyAdapter de referencia y llamada myAdapterRef.myNotifyDataSetChanged() en lugar de myRecyiclerView.getAdapter().notifyDataSetChanged(). Sont sé por qué funcionó para mí (yo tuve ese problema con el ListView)
  • No ayuda 🙁
  • ok, mi mal. Se me olvidaba para obtener y utilizar los Datos actualizados dentro de la onBindViewHolder método. Pero, ¿y el efecto de parpadeo, ¿cómo puedo deshacerme de él?
  • ok, mi bad2. El efecto de parpadeo relativa a la carga de la imagen en la imageViews dentro de mis artículos. Es un problema conocido de UniversalImageLoader (github.com/nostra13/Android-Universal-Image-Loader/issues/376) que estoy usando.
  • Me alegro de que hayas podido solucionarlo :-). Si usted desea para tratar de deshacerse de fliickering, en este enlace github.com/bajicdusko/AndroidJsonProvider/tree/master/app/src/… usted puede tratar de cargador de Imágenes que se han desarrollado por mí mismo. También admite el almacenamiento en caché, la optimización, autodownload y mostrando una imagen predeterminada en caso de errores.
  • Fueron u capaz de encontrar la solución de su [email protected] Tengo el mismo problema.

InformationsquelleAutor David | 2014-12-30

7 Comentarios

  1. 28

    Si notifyDataSetChanged() no activa las actualizaciones de la vista que hay una posibilidad de que usted se haya olvidado de llamar a SetLayoutManager() en su RecyclerView (como yo lo hice!).
    Solo no te olvides de hacer esto:
    Código Java:

    LinearLayoutManager layoutManager = new LinearLayoutManager(context ,LinearLayoutManager.VERTICAL, false);
    recyclerView.setLayoutManager(layoutManager)

    De código de C#, estoy usando Xamarin.

    var layoutManager = new LinearLayoutManager(Context, LinearLayoutManager.Vertical, false);
    recyclerView.SetLayoutManager(layoutManager);

    antes de llamar recyclerView.SetAdapter(adapter);

  2. 24

    Si su getItemCount() devuelve 0, entonces notifyDataSetChanged() no hacer nada. Asegúrese de que cuando se inicializa el adaptador, se pasa un dataset válido.

  3. 4

    De acuerdo a los javadocs: Si usted está escribiendo un adaptador siempre será más eficaz el uso de la más específica de los eventos de cambio si se puede. Confiar en notifyDataSetChanged() como un último recurso.

    public class NewsAdapter extends RecyclerView.Adapter<...> {    
    
    private static List mFeedsList;
    ...
    
        public void swap(List list){
        if (mFeedsList != null) {
            mFeedsList.clear();
            mFeedsList.addAll(list);
        }
        else {
            mFeedsList = list;
        }
        notifyDataSetChanged();
    }

    Estoy usando Retrofit para buscar la lista, en la Reconversión del onResponse() uso,

    adapter.swap(feedList);
  4. 2

    Para actualizar recyclerview podemos hacer lo siguiente:

    1. Crear y colocar el adaptador de nuevo:

      adapter=new MyAdapter(...);
      mRecyclerView.setAdapter(adapter);
    2. Claro el modelo de datos de la lista y, a continuación, notificar:

      List<YourModel> tempModel=new ArrayList<>(modelList); 
      modelList.clear();   
      modelList.addAll(tempModel); 
      adapter.notifyDataSetChanged();
  5. 0

    Quieren compartir algo, yo estaba frente a la misma cuestión. Pero lo que yo estaba haciendo mal era.
    Yo era la creación de instancia de Adaptador de cada vez nuevas y de hacer notifysetDatachange() para que la nueva instancia no el de mayor edad.

    Así que por favor asegúrese de que el Adaptador de quien notifysetDatachange() debe ser mayor que uno.
    La esperanza siguiente ejemplo ayuda..

         MyAdapter mAdapter = new MyAdapter(...)
    
        mRecyclerView.setAdapter(mAdapter );
    
    //TODO 
    mAdapter.modifyData(....);
    mAdapter.notifySetDataChange();
    
    
        MyAdapter extends baseAdapter {
         MyAdapter () {
        }
        modifyData(String[] listData) {
    
        }
    
        }
  6. 0

    Lo he solucionado mi problema como este : orderList es la Lista que me lo pase a la recyclerview . Simplemente tenemos que añadir el elemento a la posición en la lista, aquí el 0 corresponde a la posición 0 en la Lista . A continuación, llame adaptador.notifyDataSetChanged() . Funciona como un encanto

    1) orderList.add(0,Cadena);
    2) orderAdapter.notifyDataSetChanged();

  7. -2

    notifyDataSetChanged() debe ser llamado en el hilo principal.

    • Este no parece ser el problema

Dejar respuesta

Please enter your comment!
Please enter your name here