【问题标题】:GridLayoutManager setSpanSizeLookup creating blank cellsGridLayoutManager setSpanSizeLookup 创建空白单元格
【发布时间】:2015-09-03 03:21:21
【问题描述】:

目前我正在探索更多关于 RecyclerView 和 GridLayoutManager 并尝试为画廊显示实现漂亮的 UI,但我在 GridLayoutManager 的跨度大小方面遇到了一些问题。正如documentation 所说: 默认情况下,每个项目占用 1 个跨度。您可以通过 setSpanSizeLookup(SpanSizeLookup) 提供自定义 GridLayoutManager.SpanSizeLookup 实例来更改它。

有了这个,我希望如果我将位置 0 的项目的跨度设置为 2,它会将 colspan 和 rowspan 也设置为 2,但它似乎不是那样工作的。我将纵向的 GridLayoutManager 的列数设置为 2,横向的设置为 4。它非常适用于纵向,但不适用于横向,因为它在第 2 项和第 3 项下方创建了 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);
    }



}
}

这是横向和纵向的结果截图:

有什么办法可以避免出现空白单元格吗?

更新:

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

【问题讨论】:

    标签: android android-recyclerview gridlayoutmanager


    【解决方案1】:

    将您的 SpanSizeLookup 代码更改为

    mLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
        @Override
        public int getSpanSize(int position) {
            return adapter.getItemViewType(position);
        }
    });
    

    并将您的适配器的getItemViewType 代码放入

    @Override
    public int getItemViewType(int position) {
        if (position == 0) {
            return context.getResources().getInteger(R.integer.col_count);
        } else {
            return 1;
        }
    }
    

    【讨论】:

    • 抱歉,但我需要我的项目 1 有 2 列,即使我有 4 列,只需填写空白单元格以使其均匀。请参阅我所说的风景参考。
    • 好的。让我澄清一下。因此,您的问题是如何使参考中的黄色和红色框与绿色框具有相同的高度。这是你的意思吗?
    • 不,我需要它来填充横向模式下黄色和红色框底部的空白。
    • 好的。现在,您希望在黄色和红色框下方出现什么?
    • 或许你应该尝试使用AsymmetricGridView
    猜你喜欢
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-14
    • 1970-01-01
    相关资源
    最近更新 更多