7

のないアニメーションは、それは表示されませんトップ、アニメーションなし。 (ちょうどそこにあったかのように、リストの一番上に表示されます)。アイテムを削除すると、適切なアニメーションで正常に動作します。RecyclerView - (リストの先頭に挿入する必要があります)RecyclerViewに新しい項目を追加するとき、私は戻ってまで、リストをスクロールダウンしない限り、何らかの理由で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のデータベース:

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

リスナー:

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

編集:

私が使用している場合は代わりにNotifyDataSetChangedことを言及する必要がありますNotifyItemInsertedの新しい項目がすぐに表示されますが、RecyclerViewはリストの一番上にスクロールしません。 (手動でそれを見るために上にスクロールする必要があります)。 LinearLayoutManagerアイテムを最初のアイテムの上に挿入されていると考えているため

答えて

16

これが起こっています。この動作は、あなたがリストの一番上にないときに意味がありますが、あなたがリストの一番上にいるときは直感的ではないことを理解しています。一方、この動作を変更する可能性がありますが、linearLayoutManager.findFirstCompletelyVisibleItemPosition()が0の場合は、アイテムを挿入した後にlinearLayoutManager.scrollToPosition(0)と呼ぶことができます。

+0

(MediaRecorderは、オーディオをキャプチャ終了後に)私は、サービスの中からaddRecordingを呼んでいるので、私は、私はフラグメントからlm.scrollToPositionを呼び出すような方法のわからない:/ –

+0

実際に私が上記の部分を得ました!問題は...そう(0)ビューの下部に私をもたらしlm.scrollToPositionを呼び出して、この問題を解決する方法をRecyclerViewを作成するときに、私はsetReverseLayout(真)とsetStackFromEnd(true)をやったのですか?これはnotifyItemInserted(0)もアニメーション化されていない理由ですしかし、notifyItemRemoved(position)は完璧に動作し、アイテムをクリックすると、RecyclerView.ViewHolderは位置0としてトップを正しく示します。 –

+0

編集:getItemCount() - 1、奇妙なことに..まだアニメーションされていない位置を設定することによって動作するようになった:/ (私は編集を許可していない連続したコメントを残して申し訳ありません) –

2

最初の項目をnotifyItemChangeで修正します。ただ、このように:

((LinearLayoutManager) recyclerView.getLayoutManager()).scrollToPositionWithOffset(0, 0); 
adapter.notifyItemChanged(0); 
関連する問題