RecyclerView – No hay animación en NotifyItemInsert

Por alguna razón, al agregar un nuevo elemento a RecyclerView (se debe insertar en la parte superior de la lista), no aparecerá a menos que desplácese hacia abajo de la lista y volver a la parte superior, y sin animación tampoco. (Sólo aparece en la parte superior de la lista como si estuviera allí todo el tiempo). Eliminar un elemento funciona bien con las animaciones adecuadas.

RecyclerViewAdapter:

@Override public void onNewDatabaseEntryAdded() { //item added to top of the list notifyItemInserted(0); } public FileViewerAdapter(Context context) { super(); mContext = context; mDatabase = new DBHelper(mContext); mDatabase.setOnDatabaseChangedListener(this); } 

Base de datos SQLite:

 private static OnDatabaseChangedListener mOnDatabaseChangedListener; public static void setOnDatabaseChangedListener(OnDatabaseChangedListener listener) { mOnDatabaseChangedListener = listener; } public long addRecording(String recordingName, String filePath, long length) { SQLiteDatabase db = getWritableDatabase(); ContentValues cv = new ContentValues(); cv.put(DBHelperItem.COLUMN_NAME_RECORDING_NAME, recordingName); cv.put(DBHelperItem.COLUMN_NAME_RECORDING_FILE_PATH, filePath); cv.put(DBHelperItem.COLUMN_NAME_RECORDING_LENGTH, length); cv.put(DBHelperItem.COLUMN_NAME_TIME_ADDED, System.currentTimeMillis()); long rowId = db.insert(DBHelperItem.TABLE_NAME, null, cv); if (mOnDatabaseChangedListener != null) { mOnDatabaseChangedListener.onNewDatabaseEntryAdded(); } return rowId; } 

Oyente:

 public interface OnDatabaseChangedListener{ void onNewDatabaseEntryAdded(); void onDatabaseEntryRenamed(); } 

editar:

Debo mencionar que si utilizo NotifyDataSetChanged en lugar de NotifyItemInserted, entonces el nuevo elemento aparece inmediatamente, pero el RecyclerView no se desplazará a la parte superior de la lista. (Manualmente tiene que desplazarse hacia arriba para verlo).

Esto sucede porque LinearLayoutManager piensa que el elemento se inserta encima del primer elemento. Este comportamiento tiene sentido cuando no está en la parte superior de la lista, pero entiendo que no es intuitivo cuando está en la parte superior de la lista. Podemos cambiar este comportamiento, mientras tanto, puede llamar a linearLayoutManager.scrollToPosition(0) después de insertar el elemento si linearLayoutManager.findFirstCompletelyVisibleItemPosition() devuelve 0.

Lo soluciono usando el primer elemento notifyItemChange. Justo como esto:

 ((LinearLayoutManager) recyclerView.getLayoutManager()).scrollToPositionWithOffset(0, 0); adapter.notifyItemChanged(0); 
  • GetAdapterPosition () no es un método
  • Capaz de hacer clic en dos elementos al mismo tiempo en un RecyclerView
  • Firebase RecyclerVisualización infinita
  • Obtener el elemento seleccionado y su posición en RecyclerView
  • Firebase RecyclerView - Desplácese sobre la animación cuando se añade un elemento nuevo
  • Cómo hacer un indicador de página para reciclaje horizontal
  • La altura de la vista Recycler anidada no envuelve su contenido
  • SetAlpha () en onBindView en RecyclerView no funciona en la primera pantalla
  • RecyclerView no se actualiza después de NotifyDataSetChanged (), el contenido aparece después de encender y apagar la pantalla
  • Sdk mínimo para recycleview y pros / contras de reemplazar listas con ella
  • Ordenar los elementos de una visita de reciclaje mediante arrastrar y soltar
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.