Android RecyclerView ItemDecoration-如何为每个viewHolder绘制不同的宽度分隔符?
当前,我的分隔符仅绘制一个宽度: 如何为我的recyclerview中的每个增量位置添加额外的分隔符 这是我的装饰课:Android RecyclerView ItemDecoration-如何为每个viewHolder绘制不同的宽度分隔符?,android,android-recyclerview,Android,Android Recyclerview,当前,我的分隔符仅绘制一个宽度: 如何为我的recyclerview中的每个增量位置添加额外的分隔符 这是我的装饰课: public SimpleDivider(Context mContext, ArrayList<Integer> mDepth) { mDivider = ContextCompat.getDrawable(mContext, R.drawable.recycler_view_divider); this.mContext = mContext;
public SimpleDivider(Context mContext, ArrayList<Integer> mDepth) {
mDivider = ContextCompat.getDrawable(mContext, R.drawable.recycler_view_divider);
this.mContext = mContext;
this.mDepth = mDepth;
dividerMargin = 15;
}
@Override
public void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
int top = 0;
int bottom = parent.getHeight();
int childCount = parent.getChildCount();
for(int i = 0; i < childCount; ++i) {
int right = dividerMargin;
int left = 0;
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
}
publicsimplevider(Context-mContext,ArrayList-mDepth){
mDivider=ContextCompat.getDrawable(mContext,R.drawable.recycler\u view\u divider);
this.mContext=mContext;
this.mDepth=mDepth;
dividerMargin=15;
}
@凌驾
public void onDraw(@NonNull Canvas c,@NonNull RecyclerView parent,@NonNull RecyclerView.State){
int-top=0;
int bottom=parent.getHeight();
int childCount=parent.getChildCount();
对于(int i=0;i
Edit1:这是适配器。我认为不需要它,因为所有的逻辑都写在ItemDecoration类中
private ArrayList<String> mList;
public class ViewHolder extends RecyclerView.ViewHolder{
TextView singleMessageComment;
public ViewHolder(@NonNull View itemView) {
super(itemView);
singleMessageComment = itemView.findViewById(R.id.item_child_comment);
}
}
public AdapterTest(ArrayList<String> mList) {
this.mList = mList;
}
@NonNull
@Override
public AdapterTest.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.recycler_view_single_layout, viewGroup, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull AdapterTest.ViewHolder viewHolder, int i) {
viewHolder.singleMessageComment.setText(mList.get(i));
}
@Override
public int getItemCount() {
return mList.size();
}
私有数组列表mList;
公共类ViewHolder扩展了RecyclerView.ViewHolder{
TextView单条消息评论;
公共视图持有者(@NonNull View itemView){
超级(项目视图);
singleMessageComment=itemView.findViewById(R.id.item\u child\u comment);
}
}
公共适配器测试(ArrayList mList){
this.mList=mList;
}
@非空
@凌驾
public AdapterTest.ViewHolder onCreateViewHolder(@NonNull ViewGroup ViewGroup,int i){
View View=LayoutInflater.from(viewGroup.getContext()).flate(R.layout.recycler\u View\u single\u layout,viewGroup,false);
返回新的ViewHolder(视图);
}
@凌驾
BindViewHolder上的公共无效(@NonNull AdapterTest.ViewHolder ViewHolder,int i){
viewHolder.singleMessageComment.setText(mList.get(i));
}
@凌驾
public int getItemCount(){
返回mList.size();
}
添加装饰:
recyclerView.addItemDecoration(new DividerItemDecoration(this, LinearLayout.VERTICAL));
recyclerView.addItemDecoration(new LeftDividerItemDecorator(this));
左分隔符项装饰符的声明:
public class LeftDividerItemDecorator extends RecyclerView.ItemDecoration {
private final Drawable mDivider;
private final Rect mBounds = new Rect();
private final Context mContext;
LeftDividerItemDecorator(Context context) {
mContext = context;
mDivider = context.getResources().getDrawable(R.drawable.divider);
}
public void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
if (parent.getLayoutManager() != null && mDivider != null) {
drawLeftDivider(c, parent);
}
}
private void drawLeftDivider(Canvas canvas, RecyclerView parent) {
canvas.save();
int childCount = parent.getChildCount();
for (int i = 0; i < childCount; ++i) {
View child = parent.getChildAt(i);
parent.getDecoratedBoundsWithMargins(child, mBounds);
int childAdapterPosition = parent.getChildAdapterPosition(child);
int left = parent.getPaddingLeft();
// Solid size according to divider.xml width
//int right = left + (mDivider.getIntrinsicWidth());
// Dynamic size according to divider.xml width multiplied by child number
int right = left + (mDivider.getIntrinsicWidth() * (childAdapterPosition + 1));
int top = child.getTop();
int bottom = child.getBottom();
// Draw left vertical divider
mDivider.setBounds(
left,
top,
right,
bottom
);
mDivider.draw(canvas);
}
canvas.restore();
}
// Handles dividers width - move current views to right
public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
if (mDivider == null) {
outRect.set(0, 0, 0, 0);
} else {
int childAdapterPosition = parent.getChildAdapterPosition(view);
outRect.set(mDivider.getIntrinsicWidth() * childAdapterPosition, 0, 0, 0);
}
}
}
公共类LeftDividerItemDecorator扩展了RecyclerView.ItemDecoration{
专用最终可抽出式mDivider;
private final Rect mBounds=新Rect();
私有最终上下文mContext;
LeftDividerItemDecorator(上下文){
mContext=上下文;
mDivider=context.getResources().getDrawable(R.drawable.divider);
}
public void onDraw(@NonNull Canvas c,@NonNull RecyclerView parent,@NonNull RecyclerView.State){
if(parent.getLayoutManager()!=null&&mDivider!=null){
drawLeftDivider(c,父级);
}
}
私有void drawLeftDivider(画布、RecyclerView父对象){
canvas.save();
int childCount=parent.getChildCount();
对于(int i=0;i
分割器的xml:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<size
android:width="4dp"
android:height="4dp" />
<solid android:color="@color/colorAccent" />
</shape>
预览:
你能连接recyleView适配器吗?你是什么意思?我的意思是连接你的recyclerview代码。也是适配器类。@kAvEh好的,添加了适配器。我以为所有的分隔符逻辑都会在ItemDecoration类中处理?你不能只添加分隔符视图而不是添加项目装饰符吗?真是太棒了。我已经做了两天了,不知道怎么做。非常感谢你,随时打电话给@。