我正在开发一个显示网站图像的应用程序 . 图像都具有不同的高度,它们显示的视图(视图)也是如此 .
应用过滤器时,通过直接从适配器清除它们来删除先前的数据集(因此,当前可见的数据集) . 将适配器通知适配器
final int removedSize = items.size();
items.clear();
notifyItemRangeRemoved(0, removedSize);
这使旧项目在屏幕上显示动画 . 当该动画结束时,我使用添加新数据集
RecyclerView attachedView;
attachedView.getItemAnimator().isRunning(new RecyclerView.ItemAnimator.ItemAnimatorFinishedListener() { // Add a listener to listen when the new items should be added
@Override
public void onAnimationsFinished() {
attachedView.postDelayed(new Runnable() {
@Override
public void run() {
addPhotosList(objects);
notifyItemRangeChanged(0, objects.size());
loading = false;
attachedView.requestLayout();
}
},700);
}
});
这会动画添加的项目 . 奇怪的是,我有时会在RecyclerView内部出现空白,就好像RecyclerView在绘制所有项目时不会将ViewHolder的新维度考虑在内 . 更重要的是,有些物品实际上是相互叠加的,只要他们愿意,它们就会闪现在前景中 . 放置在正确位置的物品顶部的物品是应放置在间隙内的物品 . 他们不会回到差距,但在手动调查项目集时,我注意到他们应该在那里 .
RecyclerView是SwipeRefreshLayout视图的子代,但我不认为这应该是一个问题 .
我设置为RecyclerView的一些参数:
recents.setLayoutManager(layoutManager);
recents.setHasFixedSize(false);
recents.setItemViewCacheSize(100);
在布局文件中
android:animationCache="false"
android:scrollingCache="false"
我究竟做错了什么?
我已经添加了0.7秒的小延迟以确保所有动画都已完成,但这似乎没有太大帮助 .
ItemAnimator:
@Override
public boolean animateAdd(RecyclerView.ViewHolder viewHolder) {
if (viewHolder.getItemViewType() != -8) { // ImageAdapter.ViewType.EMPTY = -8;
if (viewHolder.getLayoutPosition() > lastAddAnimatedItem) {
lastAddAnimatedItem++;
runEnterAnimation((ImageListView) viewHolder, viewHolder.getLayoutPosition());
return false;
}
}
lastAddAnimatedItem = -6;
dispatchAddFinished(viewHolder);
return false;
}
@Override
public boolean animateRemove(RecyclerView.ViewHolder viewHolder) {
if (viewHolder.getItemViewType() != -8) { // ImageAdapter.ViewType.EMPTY = -8;
if (viewHolder.getLayoutPosition() > lastRemoveAnimatedItem) {
lastRemoveAnimatedItem++;
runExitAnimation((ImageListView) viewHolder, viewHolder.getLayoutPosition());
return false;
}
}
lastRemoveAnimatedItem = -6;
dispatchRemoveFinished(viewHolder);
return false;
}
private void runEnterAnimation(final ImageListView holder, int position) {
final int screenHeight = Utils.getScreenHeight(holder.itemView.getContext());
holder.itemView.setTranslationY(screenHeight + holder.itemView.getHeight());
holder.itemView.animate()
.translationY(0)
.setStartDelay(150 + (20 * (position)))
.setInterpolator(new DecelerateInterpolator(3.f))
.setDuration(700)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
dispatchAddFinished(holder);
}
})
.start();
}
private void runExitAnimation(final ImageListView holder, int position) {
final int screenHeight = Utils.getScreenHeight(holder.itemView.getContext());
holder.itemView.setTranslationY(0);
holder.itemView.animate()
.translationY(-screenHeight - holder.itemView.getHeight())
.setStartDelay(Math.abs(20 * (position)))
.setInterpolator(new DecelerateInterpolator(3.f))
.setDuration(700)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
dispatchRemoveFinished(holder);
}
})
.start();
}
编辑:
看来屏幕上 last visible 项目之后的 first 项目放在错误的位置 .