当前位置: 首页 > 知识库问答 >
问题:

GridLayoutManager设置PansizeLookup创建空白单元格

韩琛
2023-03-14

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

有了这个,我希望如果我将位置0中项目的跨度设置为2,它也会将colspan和rowspan设置为2,但似乎不是这样。对于GridLayoutManager,我将列数设置为2(纵向),将列数设置为4(横向)。它非常适合纵向,但不适合横向,因为它在第二个和第三个项目下创建了2个空单元格,我猜第一个项目没有得到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);

适配器:

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



}
}

下面是横向和纵向的结果截图:

有什么办法可以避免我有空白的牢房吗?

更新:

为了更好地可视化我想要实现的目标,这里有一个我想要的横向模式的图像。数字是基于预期位置的项目。

共有1个答案

鲁单弓
2023-03-14

将代码更改为

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;
    }
}
 类似资料:
  • 读取文件已支持 windows 系统,版本号大于等于 1.3.4.1; 扩展版本大于等于 1.2.7; PECL 安装时将会提示是否开启读取功能,请键入 yes; 测试数据准备 $config = ['path' => './tests']; $excel = new \Vtiful\Kernel\Excel($config); ​ // 写入测试数据 $filePath = $excel->f

  • 添加/home/cloudera/date.jar到类路径添加资源:/home/cloudera/date.jar 请有人帮帮我,因为我是新来蜂巢的。有人能告诉我要遵循的步骤吗

  • 因此,在excel中,我试图去掉包含信息的单元格之间的空白单元格,使用F5找到空白单元格,然后用Ctrl+-删除它们,并向上移动单元格。但当我尝试这样做时,它告诉我“没有发现细胞”。 所以我的问题是,我怎么还能做到这一点,但这些空白单元格Excel认为不是空白的?我试着通过并只按删除空白单元格,但我有很多数据,并意识到这将花费我太长的时间。我需要找到一种方法来选择这些‘空白’单元格的数据选择。 提

  • 我一直试图创建一个宏来格式化从特定外部源复制的表,问题是,一些单元格似乎从右向左填充,剩余的空间向左填充空格:

  • 我一直在用POI编写一个代码来将数据输入到Excel表中。首先,我需要遍历一组行,我不确定其中有多少行,可能是10或100行。但我发现末尾有一个空白单元格。在那个空白之后,又有一组行。我不担心第二盘。我需要找到第一盘是否已经结束。 这很让人困惑。现在我有5个用户在我的工作表如下所示。在第5个用户之后有一个空白单元格。我试图打印所有的用户,如果有一个空白停止它。

  • 我无法将此行的样式设置为: 它给我的错误是“无法在基元类型void上调用setCellValue(String)”。这种情况下的错误是什么?我如何在单行代码中实现所有3个目标?