出于某种原因,当向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); }
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.findFirstCompletelyVisibleItemPosition()返回0,则可以在插入项后调用linearLayoutManager.scrollToPosition(0).