具有GridLayoutManager的RecyclerView和具有不同viewHolder的第一个元素

幻影

我需要用两行GridLayoutManager创建一个recyclerView,第一个元素要大于其余元素。结果应如下所示:在此处输入图片说明

我设法实现了这一目标,但是采用了一种非常规的方式。在我的recyclerView适配器中,我为第一个元素使用了一个不同的viewHolder,即一个更大的元素。那将是一个很好的解决方案,但是第二个元素将低于第一个元素。因此,我给了一个技巧,使recyclerView的固定高度与第一个元素相同,这样第一个元素和第二个元素会重叠,而我只会使第二个元素的可见性消失。

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    switch (viewType) {
        case 0:
            final View view = inflater.inflate(R.layout.big_item, parent, false);
            return new BigViewHolder(view);
        case 2:
            final View view2 = inflater.inflate(R.layout.normal_item, parent, false);
            return new NormalViewHolder(view2);
        default:
            return null;
    }
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    if (position == 1) {
        holder.itemView.setVisibility(View.GONE);
    }}

@Override
public int getItemViewType(int position) {
    if (position == 0) {
        return 0;
    } else return 2;
}

但是我并不特别喜欢这种方法。有谁对此有更好的主意吗?

幻影

经过一番挖掘和咨询后,我取得了不错的成绩。我将其发布在下面:

首先,适配器应该看起来像我在问题中提到的那样,而没有隐藏第二个元素:

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

    public static final int TYPE_FIRST_ITEM = 0;
    public static final int TYPE_ITEM = 1;

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        switch (viewType) {
            case TYPE_FIRST_ITEM:
                final View view = inflater.inflate(R.layout.big_item, parent, false);
                return new BigViewHolder(view);
            case TYPE_ITEM:
                final View view2 = inflater.inflate(R.layout.normal_item, parent, false);
                return new NormalViewHolder(view2);
            default:
                return null;
        }
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        switch (holder.getItemViewType()) {
            case TYPE_FIRST_ITEM:
                BigViewHolder bigViewHolder = (BigViewHolder) holder;
                // Do what you need for the first item
                break;
            case TYPE_ITEM:
                NormalViewHolder normalViewHolder = (NormalViewHolder) holder;
                // Do what you for the other items
                break;
        }
    }

    @Override
    public int getItemViewType(int position) {
        if (position == 0) {
            return TYPE_FIRST_ITEM;
        } else return TYPE_ITEM;
    }

    final class NormalViewHolder extends RecyclerView.ViewHolder {
        public NormalViewHolder(View itemView) {
            super(itemView);
        }
        // find your views here
    }

    final class BigViewHolder extends RecyclerView.ViewHolder {
        public BigViewHolder(View itemView) {
            super(itemView);
        }
        // find your views here
    }
}

其次,布局管理器应实现一个侦听器,以指定在特定位置应有多少跨度(行):

RecyclerView mRecyclerView = view.findViewById(R.id.my_recycler_view);
        MyAdapter mAdapter = new MyAdapter();
        GridLayoutManager mLayoutManager = new GridLayoutManager(getActivity(), 2, LinearLayoutManager.HORIZONTAL, false);
        mLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
            @Override
            public int getSpanSize(int position) {
                switch(mAdapter.getItemViewType(position)){
                    case MyAdapter.TYPE_FIRST_ITEM:
                        return 2;
                    case MyAdapter.TYPE_ITEM:
                        return 1;
                    default:
                        return -1;
                }
            }
        });
        mRecyclerView.setAdapter(mAdapter);
        mRecyclerView.setLayoutManager(mLayoutManager);

希望它也能帮助别人。谢谢Mike M.的支持。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在 CSS 中选择具有特定类的序列的第一个和最后一个元素

如何使DIV中的第一个元素具有与其他元素不同的CSS?

如何使用具有不同父项的CSS选择器获取第一个匹配元素?

如何将具有不同形状的两个ndarray的最后一个元素与第一个元素组合

在显示第一个元素之后隐藏具有相同类的元素

python:将具有相同第一个元素的元组的元素分组

C ++:我有两个数组,其中第一个元素和最后一个元素具有相同的内存地址

具有元组键的字典:所有具有相同第一个元素的元组

2个具有相同CSS的元素,只修改第一个

查找具有特定一级后代的第一个父元素

具有不同的第一个参数的Typescript函数重载

对具有类名的第一个ul应用不同的样式

:具有不同类别名称的第一个孩子

从具有特定类的第一个输入中获取父表单元素

jQuery-仅针对具有类的第一个元素

仅当第一个元素具有其他同级对象时才定位

选择元素后具有特定类别的第一个兄弟姐妹

如何使用XPath选择具有特定属性的第一个元素

jQuery函数查找具有ID的第一个元素

查找具有相同第一个元素的对的平均值。科特林

将具有相同第一个元素的向量分组到向量列表中

jQuery查找具有特定类前缀的第一个父元素

具有奇怪数据的向量的第一个元素

将行高调整为具有固定列的第一个元素

在具有最小索引的数组中找到第一个重复元素

查找具有匹配日期分量的第一个日期时间元素的索引

如何选择具有JavaScript或CSS内容的第一个元素

尝试获取具有特定日期值的第一个元素的标头

如何检索向量中第一个找到的具有最低值的元素