在 StaggeredGridLayoutManager 中设置跨度

Setup span in StaggeredGridLayoutManager

我需要创建如下所示的视图(这是一个 iOS 屏幕截图,因为我已经创建了它)。

每个蓝色框都是 RecyclerView 线性布局的一部分,而每个绿色项都是交错布局的一部分。

我能够创建那个结构。问题是我不能让每个灰色框成为黄色框的一半。使用 StaggeredGridLayoutManager 我无法控制为内部回收器视图显示的框的跨度(大小)。只有 GridLayoutManager 有机会设置跨度大小查找。

需要的是根据容器的with计算箱子。例如:如果屏幕是99,那么黄色框应该是66,灰色框应该是33。

您对如何实现这一点有什么建议吗?

这里是我使用的代码片段:

public class BoxViewAdapter extends RecyclerView.Adapter<BoxViewAdapter.BoxViewHolder> {
    private List<Box> mValues;
    private Context mContext;
    protected BoxViewAdapter.ItemListener mListener;

    public BoxViewAdapter(Context context, List<Box> values, BoxViewAdapter.ItemListener itemListener) {
        mValues = values;
        mContext = context;
        mListener = itemListener;
    }

    @Override
    public BoxViewAdapter.BoxViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.box_view_item, parent, false);
        return new BoxViewAdapter.BoxViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull BoxViewAdapter.BoxViewHolder holder, int position) {
        holder.bind(mValues.get(position));
    }

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

    public interface ItemListener {
        void onItemClick();
    }

    public class BoxViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        public Box item;
        private RecyclerView recyclerView;

        public BoxViewHolder(View v) {

            super(v);

            v.setOnClickListener(this);

            StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.HORIZONTAL);
            recyclerView = v.findViewById(R.id.cardRecyclerView);
            recyclerView.setLayoutManager(staggeredGridLayoutManager);
        }

        public void bind(Box item) {
            this.item = item;
            recyclerView.setAdapter(new CardViewAdapter(itemView.getContext(), item.cards, null));
        }


        @Override
        public void onClick(View view) {
            if (mListener != null) {
                mListener.onItemClick();
            }
        }
    }
}

同时,我已经这样解决了。

CardViewAdapteronBindViewHolder 中,我只是将 LayoutParams 设置为 itemView。由于项目视图是在 RecyclerView 内呈现的,StaggeredGridLayoutManager 知道如何处理它。

@Override
public void onBindViewHolder(@NonNull CardViewHolder viewHolder, int position) {
    if (mUseLayoutParameters) {
        int singleScreenWidth = DisplayUtils.getScreenWidth() / 3;
        Card card = mValues.get(position);
        if (card.isDoubleSized) {
            singleScreenWidth = singleScreenWidth * 2;
        }

        StaggeredGridLayoutManager.LayoutParams layoutParams = new StaggeredGridLayoutManager.LayoutParams(singleScreenWidth, ViewGroup.LayoutParams.MATCH_PARENT);
        viewHolder.itemView.setLayoutParams(layoutParams);
    }

    viewHolder.bind(mValues.get(position));
}