Android GridLayoutManager设置PansizeLookup创建空白单元格

Android GridLayoutManager设置PansizeLookup创建空白单元格,android,android-recyclerview,gridlayoutmanager,Android,Android Recyclerview,Gridlayoutmanager,目前,我正在探索有关RecyclerView和GridLayoutManager的更多信息,并试图为gallery显示实现一个美观的UI,但我在GridLayoutManager的跨度大小方面遇到了一些问题。如前所述: 默认情况下,每个项目占用1个跨度。您可以通过setPansizeLookup(SpanSizeLookup)提供自定义GridLayoutManager.SpanSizeLookup实例来更改它 有了这个,我希望如果我在位置0将项目的跨度设置为2,它也会将colspan和rows

目前,我正在探索有关RecyclerView和GridLayoutManager的更多信息,并试图为gallery显示实现一个美观的UI,但我在GridLayoutManager的跨度大小方面遇到了一些问题。如前所述: 默认情况下,每个项目占用1个跨度。您可以通过setPansizeLookup(SpanSizeLookup)提供自定义GridLayoutManager.SpanSizeLookup实例来更改它

有了这个,我希望如果我在位置0将项目的跨度设置为2,它也会将colspan和rowspan设置为2,但似乎不是这样。对于GridLayoutManager,我将纵向列数设置为2,横向列数设置为4。它非常适合纵向,但不适合横向,因为它在第二和第三项下创建了两个空单元格,我猜第一项没有得到2的行间距,否则它会留下一个空单元格

这是我的密码:

gallery = new ArrayList<HashMap<String, String>>();
        adapter = new GalleryAdapter(getBaseContext(), gallery);

        // using grid layout manager
        GridLayoutManager mLayoutManager = new GridLayoutManager(this, getResources().getInteger(R.integer.col_count));

        mLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
            @Override
            public int getSpanSize(int position) {
                switch(adapter.getItemViewType(position)){
                    case 2:
                        return 2;
                    case 1:
                        return 1;
                    default:
                        return -1;
                }
            }
        });

        list_news.setLayoutManager(mLayoutManager);
        list_news.setAdapter(adapter);
gallery=newarraylist();
适配器=新GalleryAdapter(getBaseContext(),gallery);
//使用网格布局管理器
GridLayoutManager mLayoutManager=新的GridLayoutManager(this,getResources().getInteger(R.integer.col_count));
mLayoutManager.setPansizeLookup(新的GridLayoutManager.SpanSizeLookup(){
@凌驾
公共整数getSpanSize(整数位置){
开关(适配器.getItemViewType(位置)){
案例2:
返回2;
案例1:
返回1;
违约:
返回-1;
}
}
});
列表_news.setLayoutManager(mLayoutManager);
列表_news.setAdapter(适配器);
适配器:

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

    Context context;
    ArrayList<HashMap<String, String>> article;
    ImageLoader mImageLoader;

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

    public GalleryAdapter(Context context, ArrayList<HashMap<String, String>> article){
        this.context = context;
        this.article = article;
    }

    // Create new views (invoked by the layout manager)
    @Override
    public GalleryAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        // create a new view
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.articles_item, parent, false);
        // set the view's size, margins, paddings and layout parameters
        ViewHolder vh = new ViewHolder(v);
        return vh;
    }

    @Override
    public int getItemViewType(int position) {
        // Just as an example, return 0 or 2 depending on position
        // Note that unlike in ListView adapters, types don't have to be contiguous
        if(position==0){
            return 2;
        }else{
            return 1;
        }
    }

    // Replace the contents of a view (invoked by the layout manager)
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        // - get element from your dataset at this position
        // - replace the contents of the view with that element
        mImageLoader = VolleyQueue.getInstance(context).getImageLoader();
        holder.image.setImageUrl(article.get(position).get("image"), mImageLoader);
        holder.image.setDefaultImageResId(R.drawable.test);
    }

    static class ViewHolder extends RecyclerView.ViewHolder {
        @Bind(R.id.image) NetworkImageView image;

        public ViewHolder(View view) {
            super(view);
            ButterKnife.bind(this, view);
    }



}
}
公共类GalleryAdapter扩展了RecyclerView.Adapter{ 语境; ArrayList文章; 图像加载器; @凌驾 public int getItemCount(){ return article.size(); } 公共GalleryAdapter(上下文,ArrayList文章){ this.context=上下文; this.article=物品; } //创建新视图(由布局管理器调用) @凌驾 public GalleryAdapter.ViewHolder onCreateViewHolder(视图组父级,int-viewType){ //创建新视图 视图v=LayoutInflater.from(parent.getContext()).flate(R.layout.articles\u item,parent,false); //设置视图的大小、边距、填充和布局参数 视窗支架vh=新视窗支架(v); 返回vh; } @凌驾 public int getItemViewType(int位置){ //例如,根据位置返回0或2 //注意,与ListView适配器不同,类型不必是连续的 如果(位置==0){ 返回2; }否则{ 返回1; } } //替换视图的内容(由布局管理器调用) @凌驾 公共无效onBindViewHolder(ViewHolder,int位置){ //-在此位置从数据集中获取元素 //-用该元素替换视图的内容 mImageLoader=VolleyQueue.getInstance(context.getImageLoader(); holder.image.setImageUrl(article.get(position.get)(“image”),mImageLoader); holder.image.setDefaultImageResId(R.drawable.test); } 静态类ViewHolder扩展了RecyclerView.ViewHolder{ @绑定(R.id.image)网络图像视图图像; 公共视图持有者(视图){ 超级(视图); ButterKnife.bind(这个,视图); } } } 下面是横向和纵向的结果截图:

有什么办法可以避免用空白单元格

更新:

为了更好地形象化我正在努力实现的目标,这里有一个我想要的景观模式的图像。这些数字是基于预期位置的项目


将您的
SpanSizeLookup
代码更改为

mLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
    @Override
    public int getSpanSize(int position) {
        return adapter.getItemViewType(position);
    }
});
@Override
public int getItemViewType(int position) {
    if (position == 0) {
        return context.getResources().getInteger(R.integer.col_count);
    } else {
        return 1;
    }
}
以及适配器的
getItemViewType
代码

mLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
    @Override
    public int getSpanSize(int position) {
        return adapter.getItemViewType(position);
    }
});
@Override
public int getItemViewType(int position) {
    if (position == 0) {
        return context.getResources().getInteger(R.integer.col_count);
    } else {
        return 1;
    }
}

哦抱歉,但我需要我的项目1有2列,即使我有4,只是填补空白单元格,使它均匀。请参阅我所说的景观参考资料。好的。让我澄清一下。因此,您的问题是如何使引用中的黄色和红色框与绿色框具有相同的高度。这是你的意思吗?不,我需要它填补空白的空间上的黄色和红色盒子底部的景观模式。现在,您希望在黄色和红色框下面显示什么?可能您应该尝试使用