Android 在StaggedGridLayoutManager中设置范围

Android 在StaggedGridLayoutManager中设置范围,android,android-recyclerview,staggered-gridview,Android,Android Recyclerview,Staggered Gridview,我需要创建一个如下所示的视图(这是一个iOS屏幕截图,因为我已经创建了它) 每个蓝色框都是回收视图线性布局的一部分,而每个绿色项都是交错布局的一部分 我能创造出这样的结构。问题是,我不能使每个灰色框都成为黄色框的一半。使用StaggedGridLayoutManager我无法控制内部回收器视图中显示的框的范围(大小)。只有GridLayoutManager有机会设置跨度大小查找 目的是根据集装箱的尺寸计算箱子。例如:如果屏幕为99,则黄色框应为66,而灰色框应为33 你对如何实现这一目标有什么建

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

每个蓝色框都是
回收视图
线性布局的一部分,而每个绿色项都是交错布局的一部分

我能创造出这样的结构。问题是,我不能使每个灰色框都成为黄色框的一半。使用
StaggedGridLayoutManager
我无法控制内部回收器视图中显示的框的范围(大小)。只有
GridLayoutManager
有机会设置跨度大小查找

目的是根据集装箱的尺寸计算箱子。例如:如果屏幕为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();
            }
        }
    }
}
公共类BoxViewAdapter扩展了RecyclerView.Adapter{ 私有列表价值; 私有上下文; 受保护的BoxViewAdapter.ItemListener MLListener; 公共BoxViewAdapter(上下文上下文、列表值、BoxViewAdapter.ItemListener ItemListener){ M值=值; mContext=上下文; mListener=itemstener; } @凌驾 public-BoxViewAdapter.BoxViewHolder onCreateViewHolder(视图组父级,int-viewType){ 视图=LayoutView=LayoutFlater.from(mContext)。充气(R.layout.box\u视图\u项,父项,false); 返回新的BoxViewAdapter.BoxViewHolder(视图); } @凌驾 public void onBindViewHolder(@NonNull-BoxViewAdapter.BoxViewHolder,int位置){ holder.bind(mValues.get(position)); } @凌驾 public int getItemCount(){ 返回mValues.size(); } 公共接口ItemListener{ void onite mclick(); } 公共类BoxViewHolder扩展了RecyclerView.ViewHolder实现了View.OnClickListener{ 公共箱项目; 私人回收站; 公用箱视图支架(视图v){ 超级(五); v、 setOnClickListener(此); StaggedGridLayoutManager StaggedGridLayoutManager=新的StaggedGridLayoutManager(2,StaggedGridLayoutManager.HORIZONTAL); recyclerView=v.findViewById(R.id.cardRecyclerView); recyclerView.setLayoutManager(StaggedGridLayoutManager); } 公共无效绑定(框项目){ this.item=项目; setAdapter(新的CardViewAdapter(itemView.getContext(),item.cards,null)); } @凌驾 公共void onClick(视图){ if(mListener!=null){ mListener.onItemClick(); } } } }

与此同时,我已经解决了这个问题

CardViewAdapter
onBindViewHolder
中,我只需为
itemView
设置
LayoutParams
。由于项目视图是在
RecyclerView
中呈现的,因此
StaggedGridLayoutManager
知道如何处理它

@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));
}