项目需要使用瀑布流,看了下感觉还挺容易,结果上下滑动的时候遇到item换位问题
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/mRecyc"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
看了别人的解决方法,结果还是不行,最后才发现,是我把recycleview高度设成了wrap_content
附带解决方法
//声明瀑布流的布局方式: 2列,垂直方向
StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
//为recyclerView设置布局管理器
mRecyc.setLayoutManager(staggeredGridLayoutManager);
staggeredGridLayoutManager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_NONE);
在adapter内,
Map<Integer, Integer> heightArray = new HashMap<>();使用map保存已加载的view的高度
if (heightArray.get(i) == null) {
int height = 0;
ConstraintLayout.LayoutParams imageParams = (ConstraintLayout.LayoutParams) secKillViewHolder.mImage_video.getLayoutParams();
imageParams.height = height;
secKillViewHolder.mImage_video.setLayoutParams(imageParams);
heightArray.put(i, height);
} else {
int height = heightArray.get(i);
ConstraintLayout.LayoutParams layoutParams = (ConstraintLayout.LayoutParams) secKillViewHolder.mImage_video.getLayoutParams();
layoutParams.height = height;
secKillViewHolder.mImage_video.setLayoutParams(layoutParams);
}
Glide.with(context).load(bean.getImg()).apply(requestOptions).into(secKillViewHolder.mImage_video);
还有一个顶部留白问题,我没有遇到,解决办法是
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
????????if (layoutManager instanceof StaggeredGridLayoutManager) {
//防止第一行顶部有空白区域
????????((StaggeredGridLayoutManager) layoutManager).invalidateSpanAssignments();
????????}
}
|