gpt4 book ai didi

android - 只装饰 RecyclerView 的绝对第一项

转载 作者:行者123 更新时间:2023-11-29 02:42:08 24 4
gpt4 key购买 nike

我只需要向回收 View 的绝对第一项添加分隔符。

我已经读过How to selectively decorate RecyclerView items ,我明白这一点

The (onDraw) method loops over all the child views currently in the RecyclerView visible on the screen.

我的问题就是这样。因为每次 RecycleView 中的 View 更改时它都会执行,即使我只能定位和装饰第一个项目,只要我向下滚动,装饰就会转移到当前的第一个项目

在该链接中,选择是通过方法 isDecorated 完成的,该方法查看当前子项的 ViewHolder 的实例。我的猜测是这个人想根据 ViewHolder 类型进行装饰,这不是我的问题,因为我的 RecyclerView 中只有一种类型的元素

这是我的 DividerItemDecoration.java

public class DividerItemDecoration extends RecyclerView.ItemDecoration {
private Drawable mDivider;

public DividerItemDecoration(Drawable divider) {
mDivider = divider;
}

@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);

RecyclerView.ViewHolder holder = parent.getChildViewHolder(view);
if (parent.getChildAdapterPosition(view) == 1) {
outRect.top = outRect.top + mDivider.getIntrinsicHeight();
}
return;

}

@Override
public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) {
int dividerLeft = parent.getPaddingLeft();
int dividerRight = parent.getWidth() - parent.getPaddingRight();

int childCount = parent.getChildCount();
for (int i = 0; i < childCount - 1; i++) {
if(i==0 ){
View child = parent.getChildAt(i);

RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();

int dividerTop = child.getBottom() + params.bottomMargin;
int dividerBottom = dividerTop + mDivider.getIntrinsicHeight();

mDivider.setBounds(dividerLeft, dividerTop, dividerRight, dividerBottom);
mDivider.draw(canvas);
}
}
}
}

请考虑我已经搜索了一整天,只能找到示例和要点来为每个项目添加装饰器,根据类型有选择地添加它,但没有真正解决绝对位置问题。另外,请不要使用像 https://github.com/yqritc/RecyclerView-FlexibleDivider 这样的库,我要学习,而不是抄袭。

最佳答案

你可以检查它是否是第一个元素,这是一个例子:

只需实现getItemViewType(),并处理onCreateViewHolder()中的viewType参数。

所以你做这样的事情:

@Override
public int getItemViewType(int position) {
if (position == 0)
return 1;
else
return 2;
}

然后在 onCreateViewHolder 中根据您的 View 类型膨胀您的不同布局。

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == 1) {
// inflate your first item layout & return that viewHolder
} else {
// inflate your other item layout & return that viewHolder
}
}

关于android - 只装饰 RecyclerView 的绝对第一项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43409220/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com