diff --git a/addons/web/static/src/views/relational_model.js b/addons/web/static/src/views/relational_model.js
index 925cb3c9d2a..c94619e304f 100644
--- a/addons/web/static/src/views/relational_model.js
+++ b/addons/web/static/src/views/relational_model.js
@@ -1792,6 +1792,13 @@ export class DynamicRecordList extends DynamicList {
this.count = 0;
}
+ exportState() {
+ return {
+ ...super.exportState(),
+ offset: this.offset,
+ };
+ }
+
/**
* Performs a search_count with the current domain to set the count. This is
* useful as web_search_read limits the count for performance reasons, so it
diff --git a/addons/web/static/tests/views/list_view_tests.js b/addons/web/static/tests/views/list_view_tests.js
index 694f523842d..ae25d706407 100644
--- a/addons/web/static/tests/views/list_view_tests.js
+++ b/addons/web/static/tests/views/list_view_tests.js
@@ -4401,6 +4401,34 @@ QUnit.module("Views", (hooks) => {
assert.strictEqual(target.querySelector(".o_pager_limit").innerText, "4");
});
+ QUnit.test("list keeps offset on switchView", async (assert) => {
+ assert.expect(3);
+ serverData.views = {
+ "foo,false,search": `
`,
+ "foo,100,form": `