带 FlexboxLayoutManager 的交错布局

Pri*_*ola 4 android kotlin staggered-gridview android-flexboxlayout

我有什么方法可以使用与此类似的 google Flexbox 库来实现交错布局

使用 StaggeredLayoutManager 实现的布局

上面的布局是使用创建的 StaggeredLayoutManger还保持图像的纵横比的

我试过代码:

recyclerView.apply {
        layoutManager = FlexboxLayoutManager(context).apply {
            flexWrap = FlexWrap.WRAP
            justifyContent = JustifyContent.CENTER
        }
        adapter = mAdapter
    }
Run Code Online (Sandbox Code Playgroud)

但它使单列布局和纵横比也没有保持(考虑到图像尺寸较大)。

Abd*_*wee 5

在此处输入图片说明

所以这就是我在我的一个项目中所做的,使用FlexBoxLayout,在我的情况下,有些图片尺寸非常大,所以必须做一些关于并发的事情。

  flexboxLayoutManager = new FlexboxLayoutManager(yourActivity.this);
  flexboxLayoutManager.setFlexWrap(FlexWrap.WRAP);
  flexboxLayoutManager.setAlignItems(AlignItems.STRETCH);
  flexboxLayoutManager.setFlexDirection(FlexDirection.ROW);
  recyclerView.setLayoutManager(flexboxLayoutManager);
Run Code Online (Sandbox Code Playgroud)

主要逻辑来自适配器,在onBindViewHolder

 Glide.with(context)
         .load(String.format("yourUrlHere")
         .diskCacheStrategy(DiskCacheStrategy.ALL)
         .animate(R.anim.fadein)
         .override(dpToPx(90) ,dpToPx(90)) // here replace with your desired size.
         .centerCrop()
         .listener(new RequestListener<String, GlideDrawable>() {
                    @Override
                    public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
                        //  holder.loader.setVisibility(View.GONE);
                        return false;
                    }

                    @Override
                    public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
                        //  holder.loader.setVisibility(View.GONE);
                        return false;
                    }
                })
         .priority(Priority.IMMEDIATE)
          .into(viewHolder.imageView);

   ViewGroup.LayoutParams lp = viewHolder.imageView.getLayoutParams();
    if (lp instanceof FlexboxLayoutManager.LayoutParams) {
        FlexboxLayoutManager.LayoutParams flexboxLp = (FlexboxLayoutManager.LayoutParams) lp;
        Random random = new Random();
        int val = random.nextInt(5);
        if (val ==0){
            val = 1;
        }
        flexboxLp.setFlexGrow(val);
        flexboxLp.setFlexShrink(1f);

    } 
Run Code Online (Sandbox Code Playgroud)

您可以使用此代码解决您的问题,正如我在一个项目中自己实现的那样。希望这能解决您的问题。快乐编码:)

注意:在我的项目中,根据要求,我已经使用过,flexboxLayoutManager.setFlexDirection(FlexDirection.COLUMN);所以我的布局是这样的。