android:staggergridlayout 同时向上移动随机播放

San*_*idi 9 android staggeredgridlayout android-recyclerview

我正在使用交错网格布局。以下是代码:

StaggeredGridLayoutManager glm= new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
glm.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_NONE);
Run Code Online (Sandbox Code Playgroud)

GAP_HANDLING_NONE用来避免图像从一列交换到另一列。

当我启动应用程序时,屏幕的开头是:

在此处输入图片说明

向下滚动到底部后,当我回到顶部时。随机以下三张图片显示布局(它不断变化)

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

Kal*_*ani 6

交错网格在布局的边缘可能有间隙。为了避免这些间隙,StaggeredGridLayoutManager可以独立偏移跨度或在跨度之间移动项目。您可以通过以下方式控制此行为setGapStrategy(int)

StaggeredGridLayoutManager sGrid = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
sGrid.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS);
Run Code Online (Sandbox Code Playgroud)

我希望这对朋友有帮助。


Har*_*iya 0

尝试下面的代码。

在您的适配器中添加此覆盖方法

@Override
public long getItemId(int position) {
    return position;
}

@Override
public int getItemViewType(int position) {
    return position;
}
Run Code Online (Sandbox Code Playgroud)

如果这个解决方案不适合您!

尝试以下解决方案

我正在使用StaggeredGridLayout来获取所有画廊图像,它对我来说工作得很好。

- 主要活动

/*Init Gallery Photos RecyclerView*/
gallerySglm = new StaggeredGridLayoutManager(2, RecyclerView.VERTICAL);
gallerySglm.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS);
binding.rvGalleryImg.setLayoutManager(gallerySglm);
galleryPhotosAdapter = new GalleryPhotosAdapter(context, galleryPhotoArrayList);
binding.rvGalleryImg.setAdapter(galleryPhotosAdapter);
galleryPhotosAdapter.notifyDataSetChanged();
/*End Init Gallery Photos RecyclerView*/ 
Run Code Online (Sandbox Code Playgroud)

- 项目布局

在ConstraintLayout中添加 ImageView

<?xml version="1.0" encoding="utf-8"?>
<layout>

    <androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/mainCard"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:cardBackgroundColor="@color/main_bg"
        app:cardCornerRadius="@dimen/_5sdp"
        app:cardPreventCornerOverlap="false"
        app:cardUseCompatPadding="false"
        android:layout_margin="@dimen/_2sdp"
        app:layout_constraintDimensionRatio="1:1"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <androidx.constraintlayout.widget.ConstraintLayout
            android:id="@+id/clMain"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <androidx.appcompat.widget.AppCompatImageView
                android:id="@+id/img"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:scaleType="fitXY"
                android:visibility="visible"
                app:layout_constraintDimensionRatio="1:1"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

        </androidx.constraintlayout.widget.ConstraintLayout>

    </androidx.cardview.widget.CardView>

</layout>
Run Code Online (Sandbox Code Playgroud)

- 适配器

public class GalleryPhotosAdapter extends RecyclerView.Adapter<GalleryPhotosAdapter.ViewHolder> {

    private Context context;
    private ArrayList<String> arrayList;
    private ConstraintSet set = new ConstraintSet();

    public GalleryPhotosAdapter(Context context, ArrayList<String> arrayList) {
        this.context = context;
        this.arrayList = arrayList;
    }

    @NonNull
    @Override
    public GalleryPhotosAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        ItemGalleryPhotosBinding binding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()),
                R.layout.item_gallery_photos, parent, false);
        return new ViewHolder(binding);
    }

    @Override
    public void onBindViewHolder(@NonNull final GalleryPhotosAdapter.ViewHolder holder, final int position) {

        //Set size
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(arrayList.get(position), options);

        String ratio = String.format(Locale.getDefault(), "%d:%d", options.outWidth, options.outHeight);
        set.clone(holder.binding.clMain);
        set.setDimensionRatio(holder.binding.img.getId(), ratio);
        set.applyTo(holder.binding.clMain);
        //End set size

        Glide.with(context)
                .load(arrayList.get(position))
                .into(holder.binding.img);

    }

    @Override
    public int getItemCount() {
        return arrayList.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        ItemGalleryPhotosBinding binding;

        public ViewHolder(ItemGalleryPhotosBinding binding) {
            super(binding.getRoot());
            this.binding = binding;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望这可以帮助你!

谢谢。