- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在构建一个类似于 Google Hangouts 聊天界面的界面。新消息将添加到列表底部。向上滚动到列表顶部将触发加载以前的消息历史记录。当历史从网络进入时,这些消息将被添加到列表的顶部,并且不应从触发加载时用户停止的位置触发任何类型的滚动。换句话说,列表顶部会显示一个“加载指示器”:
然后将其替换为任何加载的历史记录。
我已经完成了所有这些工作......除了我不得不诉诸反射(reflection)来完成的一件事。在将项目添加到附加到 ListView 的适配器时,有很多问题和答案仅涉及保存和恢复滚动位置。我的问题是,当我执行以下操作时(简化但应该不言自明):
public void addNewItems(List<Item> items) {
final int positionToSave = listView.getFirstVisiblePosition();
adapter.addAll(items);
listView.post(new Runnable() {
@Override
public void run() {
listView.setSelection(positionToSave);
}
});
}
然后用户会看到快速闪到 ListView 顶部,然后快速闪回到正确的位置。问题比较明显,发现了by many people : setSelection()
直到 notifyDataSetChanged()
和 ListView
重绘之后才感到不高兴。所以我们必须 post()
到 View 中给它一个绘制的机会。 但是这看起来很糟糕。
我已经通过使用反射“修复”了它。我讨厌它。在其核心,我想要完成的是重置 ListView
的第一个位置,而无需经历绘制周期的繁琐,直到 我设置了位置。为此,ListView 有一个有用的字段:mFirstPosition
。天哪,这正是我需要调整的!不幸的是,它是包私有(private)的。同样不幸的是,似乎没有任何方法可以以编程方式设置它或以任何不涉及无效循环的方式影响它......产生丑陋的行为。
所以,以失败为后备的反射(reflection):
try {
Field field = AdapterView.class.getDeclaredField("mFirstPosition");
field.setAccessible(true);
field.setInt(listView, positionToSave);
}
catch (Exception e) { // CATCH ALL THE EXCEPTIONS </meme>
e.printStackTrace();
listView.post(new Runnable() {
@Override
public void run() {
listView.setSelection(positionToSave);
}
});
}
}
有效吗?是的。可怕吗?是的。将来会起作用吗?谁知道?有没有更好的办法? 这是我的问题。
如何在不反射(reflection)的情况下完成此任务?
答案可能是“编写你自己的 ListView
来处理这个问题。”我只想问你有没有seen the code for ListView
.
编辑:根据 Luksprog 的评论/答案,没有反射(reflection)的工作解决方案。
Luksprog推荐一个 OnPreDrawListener()
。迷人!我以前搞过 ViewTreeObservers,但从来没有一个。经过一番折腾,以下类型的东西似乎工作得非常完美。
public void addNewItems(List<Item> items) {
final int positionToSave = listView.getFirstVisiblePosition();
adapter.addAll(items);
listView.post(new Runnable() {
@Override
public void run() {
listView.setSelection(positionToSave);
}
});
listView.getViewTreeObserver().addOnPreDrawListener(new OnPreDrawListener() {
@Override
public boolean onPreDraw() {
if(listView.getFirstVisiblePosition() == positionToSave) {
listView.getViewTreeObserver().removeOnPreDrawListener(this);
return true;
}
else {
return false;
}
}
});
}
很酷。
最佳答案
正如我在评论中所说,OnPreDrawlistener
可能是解决问题的另一种选择。使用监听器的想法是跳过显示两种状态之间的 ListView
(在添加数据之后并将选择设置到正确的位置之后)。在 OnPreDrawListener
(使用 listViewReference.getViewTreeObserver().addOnPreDrawListener(listener);
设置)中,您将检查 ListView
的当前可见位置并针对 ListView
应显示的位置对其进行测试。如果这些不匹配,则使监听器的方法返回 false
以跳过帧并将 ListView
上的选择设置到正确的位置。设置正确的选择将再次触发绘图监听器,这次位置将匹配,在这种情况下,您将取消注册 OnPreDrawlistener
并返回 true
。
关于android - 向 ListView 添加项目,保持滚动位置并且看不到滚动跳转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19320214/
我有两个函数,在 C++ 中看起来像这样: void f1(...); void f2(...); 我可以更改 f1 的主体,但是 f2 是在另一个我无法更改的库中定义的。我绝对必须(尾部)在f1 中
我正在尝试避免这个 while 循环出了什么问题 while True: start = input("Ok, are you ready now?\n") if (start !=
当我点击按钮加载页面时,它加载正常。调整浏览器大小后,此页面会不断刷新。我复制了布局页面的一部分,用于处理按钮。如果我遗漏了什么,你能告诉我吗? Statistics 最佳答案 确保没有在“调
PHP的header函数 可以很少代码就能实现HTML代码中META 标签 这里只说用 header函数来做页面的跳转 1. HTML代码中页面的跳转的代码 HTML meta refresh 刷
我使用并喜欢 Tim Pope's excellent Fugitive plugin for VIM ,我一直希望能够加载 :Glog quickfix 中所有文件的差异,并通过它们循环到 HEAD
当我访问 my_site.com/page.php#something 时,滚动位置是携带此特定主题标签的元素之一,而不是页面顶部。 执行 window.scrollTo(0, 0); 不会改变这一事
在我自己的一个应用程序中看到这一点后,我构建了一个测试应用程序。 我在导航 Controller 中嵌入了一个集合 View 。 这一切都链接到 ViewController 类。 class Vie
在我们的应用程序中,当其中一个 View 被推送到导航 Controller 时,导航栏会显示 5 秒,然后我们将 navigationBarHidden 设置为 TRUE。稍后,如果用户点击屏幕,我
我必须更新滚动 UITextView 中的少量文本。我只会在光标当前所在的位置插入一个字符,并且只需按一下导航栏上的按钮即可执行此操作。 我的问题是,每当我调用 TextView 的setText方法
我正在使用第三方脚本(详细信息如下)将表单分解为多个 ajax 页面。当我单击前进到下一页时,它会跳转到表单顶部的 anchor 。这是一种不必要且不和谐的行为,我想阻止它发生。这个脚本不是我写的,不
这个问题已经有答案了: Call an absolute pointer in x86 machine code (2 个回答) 已关闭 4 年前。 我正在用 C 语言为 x86_64 linux 编
查看objdump -d ELFfile的输出,我无法区分直接和间接跳转/调用。有什么建议吗? 最佳答案 间接调用和跳转有*在指令之后和位置之前,如callq *%r13和jmpq *0x204d8a
我试图通过单击 anchor 链接来突出显示 div。我的意思是如果我点击My link 然后滚动到 here在此页面上,我有很多 anchor 链接和 div,因此很难识别哪个 div 然后滚动,因
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 8 年前。 Improve this ques
没有任何编程经验,只有基本的 html/css。我正在尝试创建一个 javascript 菜单(如果有更简单的方法,可以接受建议吗?),它将根据第一个菜单中选择的选项显示/隐藏?我有以下... Q
我正在使用 jquery 的 scrollTop 函数,但无法弄清楚为什么在同一项目上多次调用时它会跳来跳去。 我把这个 example 放在一起了来说明问题。单击测试按钮时,它会交替滚动到指定的项目
我已经创建了一个关于 Storyboard的项目, Storyboard上有两个名为“loginViewController”、“BViewController”的 View Controller ,
基本上,我在网站的最顶部有一个我想隐藏的 div,当您单击一个按钮时,它会将整个网站向下推并显示其内容。与此非常相似 nd.edu (单击标题右侧的帮助中心或白杨站点)。我正在使用 jquery 来完
当我单击所单击的 div 旁边的 div 框时,我的底部 div 会上下跳跃 这是 fiddle 的链接 http://jsfiddle.net/abtPH/17/ 这是我的jquery $('li
我在悬停时调整 .main-partners div 中卡片的大小,以便出现 查看更多 按钮。 我的问题是当我 :hover 在 .main-partners 中的卡片 (.main-card) 上时
我是一名优秀的程序员,十分优秀!