В детали реализации вдаваться не буду, так как интересует сам алгоритм получения записей.
Представим что в БД у нас есть 100 записей, на первой странице мы получаем первые 10 записей.
Начинаем прокручивать вниз страницы, нажимаем кнопку показать еще, подгружаем еще 10 записей.
Все хорошо в этом случае, пока у нас не появляется момент добавления записей в БД за то время пока мы просматривали первые 10.
Итак, вот мы получили первые 10 записей[1,2,3,4,5,6,7,8,9,10]
листаем вниз, за это время в БД добавились пару записей [-1,0]
при получении 2-ой страницы 10-и записей мы в ответе получим [9,10,11,12,13,14,15,16,17,18] записи
получаются дубли, и при этом первые две ( [-1,0] )не будут отображаться выше, так как мы запрашивали 2-ю страницу.
Сразу в голову приходит проверять массив на дубли, к примеру по ID записей.
Окей, а что делать если в БД за 1 секунду попало 100 записей?
2-ой страницей мы получим [-90, -89, -88, -87, -86, -85, -8, -83, -82, -81] и дойдя снова до 0 мы опять дублем получим [1,2,3,4,5,6,7,8,9,10]
Обычно делают, метку временную, когда начали листать ленту, и делают выборку из бд с применением этой метки. То есть мы сделали первый зпрос в 16:00 значит, нам нужно показать первые 10 записей из ленты, потом кто-то что-то добавляет, в 16:01, и мы в 16:02 нажимаем на кнопку показать ещё 10. После этого выборка будет идти, так чтобы мы выбрали вторую пачку данных которые были до 16:00. И так образом та запись которая была в 16:01 не попадет и ничего неполомает. А на мы интерфейсе можем показать(как в Вк например), что есть появилась новая запись.