Android RecycleView实现瀑布流(解决位置错乱)

  • 实现效果:


    image.png
  • 布局效果:


    image.png
  • 布局代码:



    

        

            

            

            

                

                

                

            

            

                

                

                

            

        

    


  • 实现adapter并设置给RecycleView
sglm = StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL)
goodsAdapter = SelfUneGoodsAdapter(this,skuList)
goodsAdapter?.setAdapterClickListener(this)
with(rvList){
    addItemDecoration(GridSpaceItemDecoration(2,10,10))
    adapter = goodsAdapter
    layoutManager = sglm
}
  • 间距
import android.graphics.Rect;
import android.util.Log;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

/**
 * 描述 : RecyclerView GridLayoutManager 等间距。
 * 

* 等间距需满足两个条件: * 1.各个模块的大小相等,即 各列的left+right 值相等; * 2.各列的间距相等,即 前列的right + 后列的left = 列间距; *

* 在{@link #getItemOffsets(Rect, View, RecyclerView, RecyclerView.State)} 中针对 outRect 的left 和right 满足这两个条件即可 *

* 作者 : shiguotao * 版本 : V1 * 创建时间 : 2020/3/19 4:54 PM */ public class GridSpaceItemDecoration extends RecyclerView.ItemDecoration { private final String TAG = "GridSpaceItemDecoration"; private int mSpanCount;//横条目数量 private int mRowSpacing;//行间距 private int mColumnSpacing;// 列间距 /** * @param spanCount 列数 * @param rowSpacing 行间距 * @param columnSpacing 列间距 */ public GridSpaceItemDecoration(int spanCount, int rowSpacing, int columnSpacing) { this.mSpanCount = spanCount; this.mRowSpacing = rowSpacing; this.mColumnSpacing = columnSpacing; } @Override public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) { int position = parent.getChildAdapterPosition(view); // 获取view 在adapter中的位置。 int column = position % mSpanCount; // view 所在的列 outRect.left = column * mColumnSpacing / mSpanCount; // column * (列间距 * (1f / 列数)) outRect.right = mColumnSpacing - (column + 1) * mColumnSpacing / mSpanCount; // 列间距 - (column + 1) * (列间距 * (1f /列数)) // 如果position > 行数,说明不是在第一行,则不指定行高,其他行的上间距为 top=mRowSpacing if (position >= mSpanCount) { outRect.top = mRowSpacing; // item top } } }

  • 解决滑动到顶部位置错乱:
    可以在
    如果导致不能显示在顶部,可以听添加一下设置:
//scroView是NestedScrollView的id,这种写法会有一种过渡的动画效果
scroView.fling(0)
scroView.smoothScrollTo(0,0)

以上解决方法,是项目中遇到的问题,如果有更好的方法,可以在下方进行评论,留下您的宝贵方法和思路,谢谢!!!

你可能感兴趣的:(Android RecycleView实现瀑布流(解决位置错乱))