使用RecyclerView的两个非传统型崩溃

当在Android应用中使用RecyclerView时,可能会遇到两种非典型崩溃:1. Scraped or attached views may not be recycled,这通常与android:animateLayoutChanges和notifyDataSetChanged()的使用有关;2. Called attach on a child which is not detached。解决方案包括确保在更新列表前避免清空数据,或者自定义LayoutManager以捕获并处理异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. Scrapped or attached views may not be recycled. isScrap:false isAttached:true

崩溃场景 : 一个普通的RecyclerView列表,点击某个item进入详情页,然后返回时崩溃(bug日志如下).发现比较难寻找到具体原因,于是搜索了大谷歌爸爸.

java.lang.IllegalArgumentException: Scrapped or attached views may not be recycled. isScrap:false isAttached:true
at android.support.v7.widget.RecyclerView$Recycler.recycleViewHolderInternal(RecyclerView.java:5659)
    at android.support.v7.widget.RecyclerView$Recycler.recycleView(RecyclerView.java:5603)
    at android.support.v7.widget.GapWorker.prefetchPositionWithDeadline(GapWorker.java:277)
    at android.support.v7.widget.GapWorker.flushTaskWithDeadline(GapWorker.java:324)
    at android.support.v7.widget.GapWorker.flushTasksWithDeadline(GapWorker.java:337)
    at android.support.v7.widget.GapWorker.prefetch(GapWorker.java:344)
    at android.support.v7.widget.GapWorker.run(GapWorker.java:370)
    at a
### 实现 RecyclerView两个项目的居中布局 为了使 `RecyclerView` 的项目能够居中显示,可以采用线性布局管理器并设置合适的参数。具体来说,在创建 `LinearLayoutManager` 时指定方向为水平,并配置适配器以适应特定需求。 #### 设置 LayoutManager 属性 在 Activity 或 Fragment 初始化 `RecyclerView` 后,可以通过自定义 `LinearLayoutManager` 来控制子项的位置: ```java // 创建带有中心对齐属性的 LinearLayoutManager 子类 public class CenterLayoutManager extends LinearLayoutManager { public CenterLayoutManager(Context context, int orientation, boolean reverseLayout) { super(context, orientation, reverseLayout); } @Override public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) { LinearSmoothScroller linearSmoothScroller = new LinearSmoothScroller(recyclerView.getContext()) { private static final float SPEED = 100f; // 控制滚动速度 @Override protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) { return SPEED / displayMetrics.densityDpi; } @Override public PointF computeScrollVectorForPosition(int targetPosition) { return CenterLayoutManager.this.computeScrollVectorForPosition(targetPosition); } }; linearSmoothScroller.setTargetPosition(position); startSmoothScroll(linearSmoothScroller); } } ``` 接着修改原有的初始化部分代码如下所示[^1]: ```java recyclerView.setLayoutManager(new CenterLayoutManager(this, HORIZONTAL, false)); recyclerView.setAdapter(new MyAdapter(dataList)); ``` #### 自定义 ItemDecoration 调整间距 为了让两个项目之间保持适当距离并且整体居于屏幕中央,还需要添加一个装饰器来调整每项之间的间隔以及两端留白: ```java public classSpaceItemDecorationextendsRecyclerView.ItemDecoration{ privatefinalintspace; publicSpaceItemDecoration(intpixels){ this.space=pixels; } @Override publicvoidgetItemOffsets(RectoutRect,intviewposition,RecyclerViewparent){ if(viewposition==0||viewposition==(parent.getAdapter().getItemCount()-1)){ outRect.left=space/2; outRect.right=space/2; }else{ outRect.left=space; outRect.right=0; } } } ``` 最后记得应用这个装饰到 `RecyclerView` 上面去: ```java recyclerView.addItemDecoration(new SpaceItemDecoration((int)getResources().getDimension(R.dimen.item_space))); ``` 以上就是关于如何让 `RecyclerView` 内部仅有的两件商品能够在屏幕上完美居中的解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值