出于某种原因,在将新项目添加到RecyclerView时(应插入到列表的顶部),除非我向下滚动列表并返回顶部,并且也没有任何动画,否则它将不会显示。 (就像出现在整个列表中一样,它刚出现在列表的顶部)。删除项目可以正常播放动画。

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认为该项目已插入到第一个项目的上方。当您不在列表顶部时,此行为是有道理的,但我知道当您在列表顶部时,这是不直观的。我们可能会更改此行为,同时,如果linearLayoutManager.scrollToPosition(0)返回0,则可以在插入项目后调用linearLayoutManager.findFirstCompletelyVisibleItemPosition()

10-08 16:42