我有一个Android异构的RecyclerView,我将ImageView和TextView混合在一起。我可以在最后一个位置添加图像或文本。如果用户已经在RecyclerView的最后一项中,则这不是问题,因为新文本或图像只是附加并显示为新的最后一项,用户可以立即查看。
但这是麻烦: 假设我在RecyclerView中有100个图像,用户正在查看第一个图像(在RecyclerView的顶部)。假设用户添加了新图像或文本(作为最后一项附加)。现在为了向用户显示这个项目,我正在调用“smoothScrollToPosition”,如下面的代码所示:
int position = myModel.getMyGenericModels().size() - 1;
myAdapter.notifyItemInserted(position);
//Smooth scroll the recyclerview to the last message
myRecyclerView.smoothScrollToPosition(position);
smoothScrollToPosition确实有效,但这个逻辑的问题是: 鉴于用户正在查看第一张图像,为了显示添加的最新图像,RecyclerView会滚动浏览所有100张图像,直到它到达最后一张图像。这是非常尴尬的,因为它需要几秒钟,您可以逐字地看到这些图像向上滚动屏幕直到它到达最后一个图像。
我的问题是,如何直接从用户正在查看的第一张图片跳转,向用户显示添加的最后一张图片?
要明确我正在寻找的行为类似于Android WhatsApp客户端展示的行为。假设您在聊天屏幕上,并且您在顶部消息,但现在添加新图像或消息,您可以看到它神奇地跳到屏幕底部显示添加的最后一条消息。没有任何明显的尴尬滚动所有消息 - 所以这似乎可能,但我不知道如何。我想知道这是怎么做的。
答案 0 :(得分:5)
scrollToPosition
是您正在寻找的那个。让我解释一下。
smoothScrollToPositon
正在使用动画加载当前和滚动到的位置之间的视图,因此这需要很长时间才能滚动到指定的位置。
scrollToPosition
不同,它只根据方向加载指定位置的视图以及视图之后或之前的视图。
这是一个RecyvlerView
Item 0 ---
Item 1 |
Item 2 | Those appearing on screen
Item 3 ---
Item 4
Item 5
Item 6
Item 7
Item 8
Item 9
smoothScrollToPosition(9)将逐个加载项目4,5,6,7,8,9,并滚动到最后。
scrollToPosition(9)只会逐个加载项目6,7,8,9,并滚动到最后。
我认为混淆来自于你从scrollToPosition
获得的滚动动画,但它是必要的,因为如果不是你会等到所有视图被绘制以滚动到指定的位置。它逐个加载项目,例如它从新列表中加载第一个项目并从当前显示项目的末尾滚动。