android - 装饰 RecyclerView(使用 GridLayoutManager)以显示项目之间的分隔线

标签 android android-recyclerview

装饰 RecyclerView 以获得这样的外观和感觉的最佳和最简单的方法是什么?

enter image description here

这里的主要挑战是只在项目之间设置分隔线,而不是在项目和屏幕的左/右边界之间。

有什么想法吗?

最佳答案

我不知道你为什么需要它,但是这个 UI 很容易用 RecyclerView 装饰器实现。

<!--Integer Value that number of column in RecyclerView-->
<integer name="photo_list_preview_columns">3</integer>

<!-- inter spacing between RecyclerView's Item-->
<dimen name="photos_list_spacing">10dp</dimen>

您可以根据需要更改 photo_list_preview_columnsphotos_list_spacing

mRecylerView.addItemDecoration(new ItemDecorationAlbumColumns(
    getResources().getDimensionPixelSize(R.dimen.photos_list_spacing), 
    getResources().getInteger(R.integer.photo_list_preview_columns)));

和装饰器(需要一些重构)

import android.graphics.Rect;
import android.support.v7.widget.RecyclerView;
import android.view.View;

public class ItemDecorationAlbumColumns extends RecyclerView.ItemDecoration {

    private int mSizeGridSpacingPx;
    private int mGridSize;

    private boolean mNeedLeftSpacing = false;

    public ItemDecorationAlbumColumns(int gridSpacingPx, int gridSize) {
        mSizeGridSpacingPx = gridSpacingPx;
        mGridSize = gridSize;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        int frameWidth = (int) ((parent.getWidth() - (float) mSizeGridSpacingPx * (mGridSize - 1)) / mGridSize);
        int padding = parent.getWidth() / mGridSize - frameWidth;
        int itemPosition = ((RecyclerView.LayoutParams) view.getLayoutParams()).getViewAdapterPosition();
        if (itemPosition < mGridSize) {
            outRect.top = 0;
        } else {
            outRect.top = mSizeGridSpacingPx;
        }
        if (itemPosition % mGridSize == 0) {
            outRect.left = 0;
            outRect.right = padding;
            mNeedLeftSpacing = true;
        } else if ((itemPosition + 1) % mGridSize == 0) {
            mNeedLeftSpacing = false;
            outRect.right = 0;
            outRect.left = padding;
        } else if (mNeedLeftSpacing) {
            mNeedLeftSpacing = false;
            outRect.left = mSizeGridSpacingPx - padding;
            if ((itemPosition + 2) % mGridSize == 0) {
                outRect.right = mSizeGridSpacingPx - padding;
            } else {
                outRect.right = mSizeGridSpacingPx / 2;
            }
        } else if ((itemPosition + 2) % mGridSize == 0) {
            mNeedLeftSpacing = false;
            outRect.left = mSizeGridSpacingPx / 2;
            outRect.right = mSizeGridSpacingPx - padding;
        } else {
            mNeedLeftSpacing = false;
            outRect.left = mSizeGridSpacingPx / 2;
            outRect.right = mSizeGridSpacingPx / 2;
        }
        outRect.bottom = 0;
    }
}

enter image description here enter image description here

关于android - 装饰 RecyclerView(使用 GridLayoutManager)以显示项目之间的分隔线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29146781/

相关文章:

android - 如何获得 DragEvent.ACTION_DROP 的正确 X、Y 坐标

java - RecyclerView 没有调用 onCreateViewHolder 或 onBindView

android - 无法从 Recycler View Adapter 启动 Activity

android - kotlin 中的 SectionedRecyclerViewAdapter

Android RecyclerView 将项目移动到 View 的末尾

android - Retrofit 2 接口(interface) - 正确的方法?

android - 执行 aapt 时出错 : Return code 138

android - 如何自动生成HTML格式的Android测试报告

android - 如何修复 'cordova' 在 Windows 命令提示符中无法识别

android - RecyclerView如何处理不同 View 的回收?