2015-11-17 3 views
44

Я пытаюсь добавить нижний слой Padding/Margin Bottom в последней строке и padding/Margin Top в первой строке. Я не могу сделать это в элементе xml, поскольку это повлияет на все мои Childs.Margin/padding в последнем дочернем элементе RecyclerView

У меня есть заголовки и Чайлдс в моем RecyclerView адаптер, так что я не могу использовать

android:padding="4dp" 
    android:clipToPadding="false" 

мне нужно использовать его в индивидуальном порядке на последней первой строке заголовка каждого

+0

Использование так: Dev

+0

Вы можете изменить отступы и поля в onBindViewHolder, а затем вызвать setIsRecyclable (false) на держателе вида – user3425867

ответ

22

использования ItemDecoration:

private class SpacesItemDecoration extends RecyclerView.ItemDecoration { 
    private int space; 

    public SpacesItemDecoration(int space) { 
     this.space = space; 
    } 

    @Override 
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { 
     if(parent.getChildAdapterPosition(view) == state.getItemCount()-1){ 
      outRect.bottom = space; 
      outRect.top = 0; //don't forget about recycling... 
     } 
     if(parent.getChildAdapterPosition(view) == 0){ 
      outRect.top = space; 
      outRect.bottom = 0; 
     } 
    } 
} 

и

//8dp as px, value might be obtained e.g. from dimen resources... 
int space = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, 
      getResources().getDisplayMetrics()); 
recyclerView.addItemDecoration(new SpacesItemDecoration(space)); 
+1

Эй, это не похоже на RecyclerView.ItemDecoration получить класс ресурсов больше, я просто добавил его как argum в конструкторе. – Krtko

+1

Решение Goog! С поддержкой обратного макета: https://gist.github.com/Miha-x64/4e8754e72a1e65e3ca742744ea501f16 –

+0

этот ответ должен быть поддержан! Хотя ответ Субина Себастьяна работает хорошо, однако, с пространством ItemDecoration не равны. – iroiroys

26

Вместо добавления отступов к верхнему и нижнему элементам вы можете просто добавить отступ в верхнюю и нижнюю часть вашего RecyclerView и установить атрибут clipToPadding на false.

<android.support.v7.widget.RecyclerView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:clipToPadding="false" 
    android:paddingTop="8dp" 
    android:paddingBottom="8dp" /> 
+0

Это простое решение, но у меня есть заголовки и дочерние элементы в моем RecyclerView, поэтому я не могу его использовать. – RedEagle

+0

@RedEagle Попробуйте посмотреть, получится ли у вас желаемый эффект, но я уверен, что он работает. –

+1

Мне нужен этот ответ, спасибо :) –

87

Этот вопрос еще проще решить. Вы можете применить необходимое дополнение к самому RecylerView и установить clipToPadding на значение false, в противном случае отступы отрубают вашу область прокрутки. Вот пример

<android.support.v7.widget.RecyclerView 
    android:padding="4dp" 
    android:clipToPadding="false" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

См. Дополнение добавит 4dp со всех сторон, включая верхнюю и нижнюю. Затем параметр clipToPadding гарантирует, что ваши дочерние элементы не будут отрублены. Теперь добавьте 4dp прокладку со всех сторон для ваших детских предметов, и вы хорошо пойдете. В общей сложности вы получаете 8dp дополнение по бокам и между пунктами.

+0

Да, как я обычно это делаю, но я мой RecyclerView состоит из заголовков, и каждый заголовок имеет свои собственные дочерние элементы, поэтому мне нужно программно его установить в последнюю и первую строку каждого только заголовок – RedEagle

+0

Не уверен, что я понимаю. Как это связано с заголовками внутри RecyclerView? Вы хотите, чтобы заголовки не имели дополнения? Даже если это так, вы можете избавиться от левой и правой прокладки с использованием того же решения. –

+0

У меня есть заголовки, и каждый заголовок имеет неспецифический подсчет дочерних элементов, поэтому я хочу добавить верхнее дополнение/край и первое дочернее и нижнее дополнение/край для последнего дочернего элемента каждого заголовка. – RedEagle

0

По-моему, решение old clipToPadding=false не подходит для меня. Поэтому я добавил ItemDecoration

https://gist.github.com/kassim/582888fa5960791264fc92bc41fb6bcf

public class BottomPaddingDecoration extends RecyclerView.ItemDecoration { 
    private final int bottomPadding; 

    public BottomPaddingDecoration(int bottomPadding) { 
     this.bottomPadding = bottomPadding; 
    } 

    @Override 
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { 
     int position = ((RecyclerView.LayoutParams) view.getLayoutParams()).getViewLayoutPosition(); 
     if (position == parent.getAdapter().getItemCount() - 1) { 
      outRect.set(0, 0, 0, bottomPadding); 
     } 
    } 
} 
-1

clipToPadding предложение не работает для меня, но я обнаружил, что использование NestedScrollView является очень удобным решением. Просто отключите прокрутку на RecyclerView, поместите его в макет с некоторым дополнением внизу и поместите макет в NestedScrollView.

Что-то вроде этого:

<NestedScrollView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     android:paddingBottom="10dp"> 
     <RecyclerView 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:nestedScrollingEnabled="false" /> <!-- Don't miss this --> 
    </LinearLayout> 
</NestedScrollView>