LayoutManager 之前的 ItemDecoration?

3
我已经为使用GridLayoutManagerRecyclerView创建了一个自定义的ItemDecoration。这个ItemDecoration确保在RecyclerView中所有子视图之间都应用了相同的间距:

enter image description here

这个ItemDecoration正如我所希望的那样工作,并且看起来很棒。然而,我注意到在设置RecyclerView的布局管理器之前需要添加ItemDecoration。我的主要问题是:为什么会这样?

我正在处理一些遗留代码,它使用CursorLoader从Web上拉取RSS订阅并将其显示给最终用户。由于某种原因,布局管理器在onLoadFinished()中设置:

@Override
public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
    Adapter adapter = new Adapter(cursor);
    adapter.setHasStableIds(true);
    mRecyclerView.setAdapter(adapter);

    GridLayoutManager gridLayoutManager =
            new GridLayoutManager(this, mColumnCount, GridLayoutManager.VERTICAL, false);

    mRecyclerView.setLayoutManager(gridLayoutManager);
}

我发现如果我在 onLoadFinished() 中添加我的 ItemDecoration,那么项目之间的边距看起来比实际要大。
@Override
public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
    Adapter adapter = new Adapter(cursor);
    adapter.setHasStableIds(true);
    mRecyclerView.setAdapter(adapter);

    GridLayoutManager gridLayoutManager =
            new GridLayoutManager(this, mColumnCount, GridLayoutManager.VERTICAL, false);

    mRecyclerView.setLayoutManager(gridLayoutManager);

    // Adding the custom ItemDecoration
    EqualOffsetItemDecoration itemDecoration = new EqualOffsetItemDecoration(this, R.dimen.card_view_margin, mColumnCount);
    mRecyclerView.addItemDecoration(itemDecoration);
}

图片描述

上面的截图显示了比我预期更多的边距,因为我只应用了 8dps(card_view_margin 的值)。然而,如果我在 onCreate() 中添加 ItemDecoration,则它将按预期显示:

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...

    mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
    mColumnCount = getResources().getInteger(R.integer.list_column_count);

    /*
    In order to have equal spacing along the edges of the screen as well as between the
    child views of the RecyclerView, an EqualOffsetItemDecoration is applied to the RecyclerView.
     */
    EqualOffsetItemDecoration itemDecoration = new EqualOffsetItemDecoration(this, R.dimen.card_view_margin, mColumnCount);
    mRecyclerView.addItemDecoration(itemDecoration);

    ...
}

所以为什么这很重要?为什么在应用布局管理器到我的RecyclerView之前需要添加ItemDecoration?我确信这与事情在幕后执行的顺序有关。任何形式的解释都将不胜感激:)

如果有人对我如何创建ItemDecoration感兴趣,可以参考以下内容:

https://github.com/mikepalarz/XYZReader/blob/master/app/src/main/java/com/example/xyzreader/ui/EqualOffsetItemDecoration.java

1个回答

2

这是一个有趣的问题,但我认为在设置项目装饰之前或之后设置布局管理器并不重要。这两个调用都会请求布局。

我猜你可能将装饰添加到了RecyclerView多次。由于装饰物可以叠加,所以如果添加了两次(或更多次)装饰物,你将看到比只添加一次时更大的间隔。


那确实是这样的!我进行了一些额外的调试,看起来onLoadFinished()由于某种原因被调用了至少两次。对我来说仍然不完全合理,因为我认为CursorLoader应该只调用此方法一次......但这超出了我的问题范围,它更多地与我正在处理的旧代码有关。感谢您在此方面的指导 :) - coolDude

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接