2015-12-01 4 views
7

У меня есть RecyclerView + LinearLayoutManger, который использует адаптер, который содержит сообщения чата. Я ограничиваю количество сообщений чата более 100 последних. Эта проблема заключается в том, что когда я удаляю старые чаты, позиция прокрутки чатов в recyclerview изменяется, потому что индекс 0 удален. Я начал писать код ниже:Поиск верхнего смещения первого видимого элемента в RecyclerView

int firstVisiblePosition = layoutManager.findFirstVisibleItemPosition(); 
View v = layoutManager.getChildAt(firstVisiblePosition); 
if (firstVisiblePosition > 0 && v != null) { 
    int offsetTop = //need to get the view offset here; 
    chatAdapter.notifyDataSetChanged(); 

    if (firstVisiblePosition - 1 >= 0 && chatAdapter.getItemCount() > 0) { 
     layoutManager.scrollToPositionWithOffset(firstVisiblePosition - 1, offsetTop); 
    } 
} 

Я думал, что было бы легко получить видимое смещение первого видимого положения позиции. Ex. если первое видимое представление 300dp, но видно только последнее 200dp, я хотел бы получить 100 смещение.

Таким образом, я мог бы использовать scrollToPositionWithOffset (firstVisiblePosition - 1, offsetTop).

Я что-то упустил? Похоже, это было бы легкой проблемой для выяснения, но я не видел никаких методов, которые бы поддерживали это.

+1

Вы пытались использовать 'v.getHeight() - v.getTop()' – Blackbelt

+0

. Я изучу его дальше. Я думаю, что v.getTop() получает координату y общей высоты прокрутки, а не относительно местоположения самой вершины recyclerview. – tylerjroach

ответ

8

@Blackbelt. Спасибо, что встретил меня на правильном пути.

Смещение, в котором я нуждался, было на самом деле просто v.getTop();

Моя настоящая проблема была в getChildAt(). Очевидно, getChildAt начинается с первой видимой позиции, а не в положении адаптера. В этом случае документация плохо написана.

Вот результирующий код.

int firstVisiblePosition = layoutManager.findFirstVisibleItemPosition(); 
View v = layoutManager.getChildAt(0); 
if (firstVisiblePosition > 0 && v != null) { 
    int offsetTop = v.getTop(); 
    chatAdapter.notifyDataSetChanged(); 

    if (firstVisiblePosition - 1 >= 0 && chatAdapter.getItemCount() > 0) { 
     layoutManager.scrollToPositionWithOffset(firstVisiblePosition - 1, offsetTop); 
    } 
} 
+0

Вы можете использовать 'View v = layoutManager.findViewByPosition (position)' –