I made this StaggeredGridLayout
for my RecyclerView
:
Here's the code:
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, final int position) {
Photo photo = mPhotos.get(position);
TextView titleView = ((CellViewHolder) viewHolder).titleTextView;
titleView.setText(photo.getTitle());
TextView subTitleView = ((CellViewHolder) viewHolder).subtitleTextView;
subTitleView.setText(photo.getName());
Picasso.with(mContext).load(photo.getPhotoUrl()).into(((CellViewHolder) viewHolder).imageView);
ImageView userImageOverlay = ((CellViewHolder) viewHolder).userImageOverlay;
StaggeredGridLayoutManager.LayoutParams layoutParams = (StaggeredGridLayoutManager.LayoutParams) viewHolder.itemView.getLayoutParams();
if (position == 0 || position % 4 == 0) {
layoutParams.setFullSpan(true);
layoutParams.height = Math.round(Utils.convertDpToPixel(202.67f, mContext));
titleView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 21.67f);
subTitleView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12.00f);
userImageOverlay.setVisibility(View.VISIBLE);
} else if ((position - 1) % 4 == 0) {
layoutParams.setFullSpan(false);
layoutParams.height = Math.round(Utils.convertDpToPixel(360.00f, mContext));
titleView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 15.00f);
subTitleView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 10.00f);
userImageOverlay.setVisibility(View.GONE);
} else {
layoutParams.setFullSpan(false);
layoutParams.height = Math.round(Utils.convertDpToPixel(180.00f, mContext));
titleView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 15.00f);
subTitleView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 10.00f);
userImageOverlay.setVisibility(View.GONE);
}
}
Everything works fine except when I scroll it up. It draws cells by position in descending order and it leaves empty spaces in grid:
Any ideas how to keep the same pattern even scrolling it up?
Try this:
StaggeredGridLayoutManager manager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
manager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS);
recyclerView.setLayoutManager(manager);
or:change position when scrolling
or:github project Picasso/Glide-RecyclerView-StaggeredGridLayoutManager
you need to set the gap strategy
mLayoutMang.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS);
GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS
will update the layous when the scroll state is changed to idle
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With