Страницы

Поиск по вопросам

пятница, 14 февраля 2020 г.

Добавить разделитель элементов в RecyclerView

#android #recyclerview


Есть такая разметка для элемента (т.е. пункта списка для RecyclerView)




    

        

        

            

            
        

    




Мне нужно чтобы элементы в списке были разделены также как на картинке, т.е чтобы
после каждого элемента была линия. Как это сделать?


    


Ответы

Ответ 1



Для этого можно прописать View- ку

Ответ 2



Я это делаю с помощью класса DividerItemDecoration унаследованного от RecyclerView.ItemDecoration: public class DividerItemDecoration extends RecyclerView.ItemDecoration { private Drawable mDivider; private int mOrientation; public DividerItemDecoration(Drawable divider) { mDivider = divider; } @Override public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) { if (mOrientation == LinearLayoutManager.HORIZONTAL) { drawHorizontalDividers(canvas, parent); } else if (mOrientation == LinearLayoutManager.VERTICAL) { drawVerticalDividers(canvas, parent); } } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { super.getItemOffsets(outRect, view, parent, state); if (parent.getChildAdapterPosition(view) == 0) { return; } mOrientation = ((LinearLayoutManager) parent.getLayoutManager()).getOrientation(); if (mOrientation == LinearLayoutManager.HORIZONTAL) { outRect.left = mDivider.getIntrinsicWidth(); } else if (mOrientation == LinearLayoutManager.VERTICAL) { outRect.top = mDivider.getIntrinsicHeight(); } } private void drawHorizontalDividers(Canvas canvas, RecyclerView parent) { int parentTop = parent.getPaddingTop(); int parentBottom = parent.getHeight() - parent.getPaddingBottom(); int childCount = parent.getChildCount(); for (int i = 0; i < childCount - 1; i++) { View child = parent.getChildAt(i); RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); int parentLeft = child.getRight() + params.rightMargin; int parentRight = parentLeft + mDivider.getIntrinsicWidth(); mDivider.setBounds(parentLeft, parentTop, parentRight, parentBottom); mDivider.draw(canvas); } } private void drawVerticalDividers(Canvas canvas, RecyclerView parent) { int parentLeft = parent.getPaddingTop() * 9; int parentRight = parent.getWidth() - parent.getPaddingRight(); int childCount = parent.getChildCount(); for (int i = 0; i < childCount - 1; i++) { View child = parent.getChildAt(i); RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); int parentTop = child.getBottom() + params.bottomMargin; int parentBottom = parentTop + mDivider.getIntrinsicHeight(); mDivider.setBounds(parentLeft, parentTop, parentRight, parentBottom); mDivider.draw(canvas); } } } Где parent.getPaddingTop() * 9: parent.getPaddingTop - верхний Padding RecyclerView, в моем случае он равен 10dp А умножаю на 9, так как от левого края округленного ImageView до текста отступ 90dp И в Activity или где вы инициализируете ваш RecyclerView: private void initRecyclerView() { mChatsRV.setLayoutManager(new LinearLayoutManager(getApplicationContext())); mChatsRV.addItemDecoration(new DividerItemDecoration(ContextCompat.getDrawable(this, R.drawable.items_divider))); } И сама линия(разметка) items_divider.xml:

Комментариев нет:

Отправить комментарий