8

确切地说,我想实现这一目标。 在此处输入图像描述

我正在使用带有 GridLayoutManager 的 recyclerview。我还使用以下代码使第一个项目变大

        lLayout.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
        @Override
        public int getSpanSize(int i) {
            if (i==0) return 2;
            else return 1;
        }
    });

一切正常,除了一个:位置 1 的项目(即大图像中的下一个项目)被垂直拉长以匹配大项目的高度。从第 3 行开始,所有图像都如图所示。

我怎样才能摆脱这个?

编辑:经过一些分析

所以问题似乎是大图像在水平方向上占据了两个跨度,但在垂直方向上占据了一个跨度,并且因为我已经强制我的 ImageView 是方形的,所以看起来它也占据了两行,而实际上它是单行。由于这个原因,第二张图像似乎被拉长了。

所以现在我的问题是,如何使网格项目垂直两个跨度和水平两个跨度?

4

2 回答 2

6

尝试使用StaggeredGridLayoutManager而不是GridLayoutManagerStaggeredGridLayoutManager支持水平和垂直布局以及反向布局子项的能力。 适配器的onBindViewHolder方法,您可以使用此代码根据项目的位置设置跨度

final ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams();    
if (position == 0) {
                StaggeredGridLayoutManager.LayoutParams sglp = (StaggeredGridLayoutManager.LayoutParams) lp;
                sglp.setFullSpan(true);
                holder.itemView.setLayoutParams(sglp);
            }

找到示例http://enoent.fr/blog/2015/01/18/recyclerview-basics/ ...希望对您有所帮助

于 2015-08-03T10:58:07.233 回答
0

在 GridViewAdapter 类中尝试以下代码

public class GridViewAdapter extends BaseAdapter {
private Context context;
private ArrayList<Integer> imageArrayList = new ArrayList<>();
private int type;

public GridViewAdapter(Context context, ArrayList<Integer> imageArrayList) {
    this.context = context;
    this.imageArrayList = imageArrayList;
}

@Override
public int getCount() {
    return imageArrayList.size();
}

@Override
public Object getItem(int position) {
    return imageArrayList.get(position);
}

@Override
public long getItemId(int position) {
    return 0;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder viewHolder = new ViewHolder();
    if(convertView==null){
        LayoutInflater inflater = LayoutInflater.from(context);
        type = getItemViewType(position);
        if(type==0) {
            convertView = inflater.inflate(R.layout.big_layout,parent,false);
        }else {
            convertView = inflater.inflate(R.layout.small_layout, parent, false);
        }
        viewHolder.imageView = convertView.findViewById(R.id.imageView);
        convertView.setTag(viewHolder);
    }else{
        viewHolder = (ViewHolder) convertView.getTag();
    }
        viewHolder.imageView.setImageDrawable(context.getResources().getDrawable(imageArrayList.get(position)));
    return convertView;
}

@Override
public int getViewTypeCount() {
    return super.getViewTypeCount();
}

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

    private class ViewHolder{
        ImageView imageView;
    }
}
于 2015-08-03T12:15:19.317 回答