我正在尝试实现一个列表,其中包含一个列表和其他视图在活动页面上的其他视图。
我在整个页面上使用LinearLayout
,列表使用RecyclerView
,以及RecyclerView
下方的其他视图(ImageView
,Buttons
...等)
这是我的最终视图层次结构:
<LinearLayout>
<TextView />
<RecyclerView />
<Button />
<EditText />
<ImageView />
</LinearLayout>
我已经实施了RecyclerView
,可以添加和删除项目。我使用的是LinearLayoutManager
,而无需指定ItemAnimator
,因此使用DefaultItemAnimator
。
将项目添加到列表中,按预期工作。我的问题是,当i remove 从 RecyclerView
中删除项目时,页面并不能很好地动画(通过先从数据集中删除,然后使用RecyclerViewAdapter.notifyItemRemoved
)。
发生的事情是首先要捕捉到新的RecyclerView
高度,然后RecyclerView
项目删除动画完成,这使得页面的行为看起来很奇怪,因为RecyclerView
下方的所有视图在删除时都会删除。项目逐渐消失,但尚未损失高度,然后剩下的RecyclerView
项目(在已删除的项目下方)向上滚动,看起来它们从墙下面滑动。
我试图在网络上寻找解决方案,找不到任何解决问题的方法。
我发现了这个未解决的问题,描述了同样的问题。如果我的解释还不够清楚,请参考它。
有人遇到同样的问题吗?有什么建议吗?
谢谢。
我也有同样的问题。在我的情况下,这条线有所帮助:
recyclerView.setHasFixedSize(true);
尝试此操作,并检查它是否可以作为您的期望:
recyclerView.setHasFixedSize(true);
recyclerView.setItemAnimator(new MyAnim());
public static class MyAnim extends RecyclerView.ItemAnimator {
@Override
public boolean animateDisappearance(@NonNull RecyclerView.ViewHolder viewHolder, @NonNull ItemHolderInfo preLayoutInfo, @Nullable ItemHolderInfo postLayoutInfo) {
return false;
}
@Override
public boolean animateAppearance(@NonNull RecyclerView.ViewHolder viewHolder, @Nullable ItemHolderInfo preLayoutInfo, @NonNull ItemHolderInfo postLayoutInfo) {
return false;
}
@Override
public boolean animatePersistence(@NonNull RecyclerView.ViewHolder viewHolder, @NonNull ItemHolderInfo preLayoutInfo, @NonNull ItemHolderInfo postLayoutInfo) {
return false;
}
@Override
public boolean animateChange(@NonNull RecyclerView.ViewHolder oldHolder, @NonNull RecyclerView.ViewHolder newHolder, @NonNull ItemHolderInfo preLayoutInfo, @NonNull ItemHolderInfo postLayoutInfo) {
final float prevAlpha = ViewCompat.getAlpha(oldHolder.itemView);
ViewCompat.setAlpha(oldHolder.itemView, prevAlpha);
ViewCompat.setAlpha(newHolder.itemView, 0);
return true;
}
@Override
public void runPendingAnimations() {
}
@Override
public void endAnimation(RecyclerView.ViewHolder item) {
}
@Override
public void endAnimations() {
}
@Override
public boolean isRunning() {
return false;
}
}
创建RecyclerView
的子类和覆盖onTouchEvent
类似的方法:
@Override
public boolean onTouchEvent(MotionEvent e) {
if (findChildViewUnder(e.getX(), e.getY()) == null) {
return false;
}
return super.onTouchEvent(e);
}
另外,请勿将wrap_content
用作RecyclerView
高度/宽度,具体取决于您的方向。
这样,RecyclerView
的尺寸固定,并且在删除项目时不会切断项目。onTouchEvent
方法的操作确保RecyclerView
的一部分不消耗单击事件,并将其发送到RecyclerView
的父视图。
您需要设置回收瓶的高度或将其保存到的容器中:'match_parent''。对我来说像Cahrm一样工作。
来源:https://medium.com/mobile-app-development-publication/recyclerview-supported-wrap-content-not-quntent-not-quite-f04a942ce624