gpt4 book ai didi

android - 游标适配器加载列表从下到上用于聊天应用程序

转载 作者:行者123 更新时间:2023-11-29 00:04:29 44 4
gpt4 key购买 nike

我正在开发一个聊天应用程序,我正在使用光标适配器来显示聊天列表。聊天在服务器上备份,我们有加载更多聊天功能,允许用户从服务器获取他最近的 50 个聊天。

此加载更多按钮位于列表顶部。

因此,当我将这些新聊天添加到我的数据库并交换光标以重新加载 ListView 时, ListView 滚动位置不会保持不变并且列表会转到顶部,这是不正确的行为。我想保持 ListView 滚动位置,就像按下加载更多聊天按钮时在 whatsapp 聊天中发生的那样。

我设法通过使用 setSelectionFromTop 方法使用这段代码来保持滚动位置:

int firstVisibleItem = listView.getFirstVisiblePosition();
View view = chatList.getChildAt(0);
int pos = (view == null ? 0 : view.getBottom());
// swap cursor to reload the list
listView.setSelectionFromTop(firstVisibleItem + addedItemsCount + 1, pos);

但是当我这样做时,listview 给我一个小故障,这可能是由于 listview 滚动位置先到达顶部然后又回到我选择的位置。

我希望 ListView 仅从下到上单独呈现新项目,同时保持滚动位置,就像在 whatsapp 中发生的那样,没有任何故障。

我也使用了 listviews stackfrombottom 方法,但它似乎不起作用。

有关此的任何帮助都会有很大帮助。寻找一种在保持其滚动位置的同时从 bottomToTop 呈现 ListView 的详细方法。

谢谢。

最佳答案

所以我设法解决了我的问题,事实证明 listView 总是从上到下开始放置其元素,因此要保持光标位置,您必须使用 listView 的 setSelectionFromTop 方法明确指定所选项目的位置,如下所示:-

int firstVisibleItem = listView.getFirstVisiblePosition();
View view = chatList.getChildAt(0);
int pos = (view == null ? 0 : view.getBottom());
// swap cursor to reload the list
listView.setSelectionFromTop(firstVisibleItem + addedItemsCount + 1, pos);

但这会给您带来轻微的闪烁效果(因为列表将从顶部开始,您会再次将其拖回下方),这看起来非常糟糕。因此,为了克服这种情况,我们需要阻止 ListView 对其项目进行布局。

我偶然发现了 chris banes 的一篇很棒的文章,解释了如何去做。 Here is link

要阻止 listView 放置其子项,我们需要覆盖其 layoutChildren 方法。公共(public)类 BlockingListView 扩展 ListView {

private boolean mBlockLayoutChildren;

public BlockingListView(Context context, AttributeSet attrs) {
super(context, attrs);
}

public void setBlockLayoutChildren(boolean block) {
mBlockLayoutChildren = block;
}

@Override
protected void layoutChildren() {
if (!mBlockLayoutChildren) {
super.layoutChildren();
}
}

然后做 listView.setBlockLayoutChildren(true);

int firstVisibleItem = listView.getFirstVisiblePosition();
View view = chatList.getChildAt(0);
int pos = (view == null ? 0 : view.getBottom());
// swap cursor to reload the list or notifyDataSetChange for BaseAdapter
listView.setSelectionFromTop(firstVisibleItem + addedItemsCount + 1, pos);

listView.setBlockLayoutChildren(false)

通过这种方式,我们可以阻止 listView 出现故障,它为我们提供了从底部到顶部的无缝滚动体验,同时连续加载项目,就像我们在著名的聊天应用程序(如 whatsApp 和 slack 等)中一样。

关于android - 游标适配器加载列表从下到上用于聊天应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34948205/

44 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com