我正在尝试在最后一行添加填充/边距底部,在第一行添加填充/边距顶部。我无法在xml项目中执行此操作,因为它会影响我所有的孩子。
我的RecyclerView适配器中有标题和子元素,因此我不能使用
android:padding="4dp"
android:clipToPadding="false"
我需要在每个标题的最后第一行中单独使用它
我正在尝试在最后一行添加填充/边距底部,在第一行添加填充/边距顶部。我无法在xml项目中执行此操作,因为它会影响我所有的孩子。
我的RecyclerView适配器中有标题和子元素,因此我不能使用
android:padding="4dp"
android:clipToPadding="false"
我需要在每个标题的最后第一行中单独使用它
Answers:
我在科特林用这个
override fun onBindViewHolder(holder: RecyclerView.ViewHolder(view), position: Int) {
if (position == itemsList.lastIndex){
val params = holder.itemView.layoutParams as FrameLayout.LayoutParams
params.bottomMargin = 100
holder.itemView.layoutParams = params
}else{
val params = holder.itemView.layoutParams as RecyclerView.LayoutParams
params.bottomMargin = 0
holder.itemView.layoutParams = params
}
//other codes ...
}
这个问题甚至更容易解决。您可以对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填充。
您可以仅将RepaderView的顶部和底部添加填充并将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" />
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) {
int position = parent.getChildAdapterPosition(view);
boolean isLast = position == state.getItemCount()-1;
if(isLast){
outRect.bottom = space;
outRect.top = 0; //don't forget about recycling...
}
if(position == 0){
outRect.top = space;
// don't recycle bottom if first item is also last
// should keep bottom padding set above
if(!isLast)
outRect.bottom = 0;
}
}
}
和
//8dp as px
int space = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8,
getResources().getDisplayMetrics()); // calculated
//int space = getResources().getDimensionPixelSize(
// R.dimen.list_item_padding_vertical); // from resources
recyclerView.addItemDecoration(new SpacesItemDecoration(space));
notifyItemInserted
/ Removed
将仅绘制一项/删除项并对其进行清洁,View
从而使所有其他子项保持不变。例如,当某项位于列表的第一项(使用顶部填充绘制)并且我们将新项添加到顶部时,先前的第一项-当前第二项仍将填充在顶部...容易解决的方法是调用notifyDataSetChanged
(强制重画所有...),更复杂的需要一些逻辑来识别位于第一个和/或最后一个位置的项目已移动然后调用notifyItemChanged(newPositionOfOldFirstAndOrLastItem)
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_tpf"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipToPadding="false"
android:paddingBottom="100dp" />
在您的recyclerview中添加android:clipToPadding="false"
和android:paddingBottom="100dp"
。
在您的recyclerview中添加android:clipToPadding =“ false”和android:paddingBottom =“ 65dp”。如果您使用的是fab菜单按钮和对回收者视图单元的操作。
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/dinner_recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipToPadding="false"
android:paddingBottom="65dp"/>
由于某种原因,旧的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);
}
}
}
我已经修改了惊人的答案@snachmsm答案,以便更好,让您知道如何正确使用
public class SpacesItemDecoration extends DividerItemDecoration {
private int space;
public SpacesItemDecoration(Context clContext,int oriantation,int space) {
super(clContext,oriantation);
this.space = space;
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect,view,parent,state);
int position = parent.getChildAdapterPosition(view);
boolean isLast = position == state.getItemCount()-1;
if(isLast){
outRect.bottom = space;
outRect.top = 0; //don't forget about recycling...
}
/* if(position == 0){
outRect.top = space;
// don't recycle bottom if first item is also last
// should keep bottom padding set above
if(!isLast)
outRect.bottom = 0;
}*/
}
}