java 当前数据集替换,替换RecyclerView的数据集时出现问题

开发者分享在开发图像展示应用时遇到的问题,如RecyclerView中项目动画导致的空白区域和重叠显示。文章探讨了如何调整ItemAnimator、清除缓存和延迟添加策略,以解决动画结束后视图布局混乱的问题。
摘要由CSDN通过智能技术生成

我正在开发一个显示网站图像的应用程序 . 图像都具有不同的高度,它们显示的视图(视图)也是如此 .

应用过滤器时,通过直接从适配器清除它们来删除先前的数据集(因此,当前可见的数据集) . 将适配器通知适配器

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 项目放在错误的位置 .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值