在StaggeredGridLayoutManager中设置跨度

时间:2018-07-09 14:06:49

标签: android android-recyclerview staggered-gridview

我需要创建如下所示的视图(这是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();
            }
        }
    }
}

enter image description here

1 个答案:

答案 0 :(得分:0)

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

onBindViewHolder的{​​{1}}中,我仅将CardViewAdapter设置为LayoutParams。由于项目视图是在itemView内部渲染的,因此RecyclerView知道如何处理它。

StaggeredGridLayoutManager