7

Aus irgendeinem Grund, wenn ein neues Element zum RecyclerView hinzugefügt wird (sollte an den Anfang der Liste eingefügt werden), wird es nicht angezeigt, es sei denn, ich scrolle die Liste hinunter und zurück zum oben und ohne jegliche Animation. (Erscheint ganz oben in der Liste, als wäre es die ganze Zeit dort). Das Entfernen eines Objekts funktioniert mit den richtigen Animationen.RecyclerView - Keine Animation auf NotifyItemInsert

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); 
} 

SQLite Datenbank:

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; 
} 

Zuhörer:

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

edit:

Ich sollte erwähnen, dass, wenn ich stattdessen NotifyDataSetChanged verwenden von NotifyItemInserted, dann wird das neue Element sofort angezeigt, aber der RecyclerView wird nicht zum Anfang der Liste blättern. (Manuell nach oben scrollen, um es zu sehen).

Antwort

16

Dies geschieht, weil LinearLayoutManager denkt, dass das Element über dem ersten Element eingefügt wird. Dieses Verhalten ist sinnvoll, wenn Sie nicht an der Spitze der Liste stehen, aber ich verstehe, dass es nicht intuitiv ist, wenn Sie an der Spitze der Liste stehen. Wir können dieses Verhalten ändern, unterdessen können Sie linearLayoutManager.scrollToPosition(0) nach dem Einfügen des Elements aufrufen, wenn linearLayoutManager.findFirstCompletelyVisibleItemPosition() 0 zurückgibt.

+0

Ich addRecording aus dem Inneren einer Service-Rufnummer (nach MediaRecorder Audio-Video aufgenommen wurde), so bin ich der Art und Weise nicht sicher, ob ich lm.scrollToPosition aus dem Fragment nennen würde:/ –

+0

i tatsächlich hab diesen Teil oben! Das Problem ist, ich habe setReverseLayout (true) und setStackFromEnd (true) beim Erstellen der RecyclerView, also Aufruf von lm.scrollToPosition (0) bringt mich auf der Unterseite der Ansicht .. eine Möglichkeit, das zu beheben? Vielleicht ist dies auch der Grund, warum notifyItemInserted (0) nicht animiert? NotifyItemRemoved (position) funktioniert jedoch einwandfrei .. und der RecyclerView.ViewHolder zeigt die oberste Position korrekt an, wenn Sie auf ein Objekt klicken. –

+0

edit: Habe es geschafft, indem ich die Position auf getItemCount() - 1 setze, seltsamerweise .. immer noch nicht animiert:/ (sorry für kontinuierliche Kommentare, stackoverflow erlaubt mir nicht zu bearbeiten) –

2

Ich behebe es mit notifyItemChange ersten Element. Genau wie folgt aus:

((LinearLayoutManager) recyclerView.getLayoutManager()).scrollToPositionWithOffset(0, 0); 
adapter.notifyItemChanged(0);