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:
- No se puede colocar la vista debajo de RecyclerView
- Obtener el ancho de CardView en Adapter.onBindViewHolder
- Configurar RecyclerView para trabajar como chat
- Cómo ordenar Strings en un Android RecyclerView?
- Fade out / fade en TextView basado en desplazamiento
@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).
- Incrustación de anuncios en Recyclerview
- v7 RecyclerView NullPointerException AccessibilityDelegateCompat.getBridge ()
- Android RecyclerView: Cambiar archivo de diseño LIST a GRID onOptionItemSelected
- RecyclerView - animar el cambio de las columnas del gestor de diseño de cuadrícula
- Uso de RecyclerView con tarjeta
- RecyclerView notifyItemRangeChanged no muestra nuevos datos
- SwipeRefreshLayout está oculto en vacío RecyclerView
- Firebase android ¿Cómo evitar que FirebaseRecyclerAdapter se actualice automáticamente?
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);