无需重新填充即可更新GridView/ListView

tyc*_*czj 7 android android-listview android-adapter android-gridview

无论何时更新GridView/ListView,都要调用notifyDatasetChanged适配器,该适配器使用新数据重新填充列表,删除当前列表中的所有内容.

现在以设计指南中的这个小视频为例L Preview

是否有可能实现同样的效果,你看到的唯一变化是当适配器重新加载时没有任何"闪烁"的新项目,或者这是现在只能在L中完成的事情?

Google Keep添加新笔记时,也可以在应用程序中找到此效果

Vik*_*ram 8

我担心它的所有视觉技巧 - 也就是动画.

...删除列表中当前的所有内容.

实际上,没有.

notifyDataSetChanged只告诉基础观察者数据已经改变.而已.作为响应,getView(...)每个可见视图调用- 可访问的数字ListView#getChildCount().由于任一索引都已更改(添加/删除项目),或者这些索引中的对象中保存的数据已更改(^)(一个或多个项目已更改),因此后续调用可以在视觉上刷新数据(^)ListView#getView(...).

"Android开发者"有一个有趣的视频,解释了如何产生你想要的效果:DevBytes:ListView Cell Insertion Animation.

视频/示例仅讨论单个项目插入.但它应该可以扩展到具有一些时间和数学技能的所有数据操作.

我能够扩展示例代码以插入多个项目.我将动画更改为更简单的alpha-f-in.单击该Add row按钮可将随机数(1到3之间)添加到列表视图中.这是它的样子:

在此输入图像描述

伪的工作流程:

  • 在将新项目传递给适配器之前,循环遍历列表视图中的所有可见项目并保存其边界(in Rect)和snapshot(in BitmapDrawables)

  • 将项目传递给适配器

  • 添加OnPreDrawListener到ListView的ViewTreeObserver.

  • onPreDraw(...)被调用时,新的项目即可提取.我们可以views使用ListView#getChildAt(...)相应的索引访问它们.

  • 所有新项目都设置为不可见,并且分配了alpha动画师

  • 所有旧项目都分配了translation_y动画师

  • 将无法再访问的getChildAt(..)项目 - 因为添加新项目 - 被分配了translation_y动画师 - 以使其脱离屏幕(或超出列表视图范围)

  • translation_y动画师被解雇了.当这些动画师完成运行时,将启动alpha动画师.

请注意,动画的类型(alpha,翻译,缩放或这些动画的任意组合)相对无关紧要.我想这会在的情况下更难GridViewStaggeredGridView(保持) -不仅是因为数学会涉及两个翻译X Y.但工作流程应保持不变.

(^) - 语法错误,但自然的IMO.