Android的RecyclerView的ItemDecoration分隔线在滚动之前是不可见的。
创始人
2024-10-07 08:30:36
0

要实现Android的RecyclerView的ItemDecoration分隔线在滚动之前是不可见的,可以通过以下代码示例来解决:

  1. 首先,创建一个名为DividerItemDecoration的类,继承自RecyclerView.ItemDecoration:
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import androidx.annotation.DrawableRes;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.RecyclerView;

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

    public DividerItemDecoration(Context context, @DrawableRes int resId) {
        divider = ContextCompat.getDrawable(context, resId);
    }

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

        int childCount = parent.getChildCount();
        for (int i = 0; i < childCount - 1; i++) {
            RecyclerView.ViewHolder viewHolder = parent.getChildViewHolder(parent.getChildAt(i));
            if (viewHolder instanceof MyAdapter.MyViewHolder) {
                MyAdapter.MyViewHolder myViewHolder = (MyAdapter.MyViewHolder) viewHolder;
                if (!myViewHolder.isScrolling()) {
                    continue; // 如果Item不处于滚动状态,则跳过绘制分隔线
                }
            }

            RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) parent.getChildAt(i).getLayoutParams();
            int top = parent.getChildAt(i).getBottom() + params.bottomMargin;
            int bottom = top + divider.getIntrinsicHeight();
            divider.setBounds(left, top, right, bottom);
            divider.draw(canvas);
        }
    }
}
  1. 接下来,在你的RecyclerView的Adapter中,在ViewHolder中添加isScrolling()方法来判断Item是否处于滚动状态:
import android.view.View;
import android.widget.TextView;

import androidx.recyclerview.widget.RecyclerView;

public class MyAdapter extends RecyclerView.Adapter {
    // ...

    public class MyViewHolder extends RecyclerView.ViewHolder {
        private TextView textView;

        private boolean isScrolling;

        public MyViewHolder(View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.textView);
        }

        public void bindData(String data) {
            textView.setText(data);
        }

        public void setScrolling(boolean scrolling) {
            isScrolling = scrolling;
        }

        public boolean isScrolling() {
            return isScrolling;
        }
    }
}
  1. 最后,在你的RecyclerView的Activity或Fragment中,设置ItemDecoration并监听RecyclerView的滚动状态:
import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

public class MainActivity extends AppCompatActivity {
    private RecyclerView recyclerView;
    private MyAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerView = findViewById(R.id.recyclerView);
        adapter = new MyAdapter();

        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(adapter);
        recyclerView.addItemDecoration(new DividerItemDecoration(this, R.drawable.divider));

        recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                for (int i = 0; i < recyclerView.getChildCount(); i++) {
                    RecyclerView.ViewHolder viewHolder = recyclerView.getChildViewHolder(recyclerView.getChildAt(i));
                    if (viewHolder instanceof MyAdapter.MyViewHolder) {
                        MyAdapter.MyViewHolder myViewHolder = (MyAdapter.MyViewHolder) viewHolder;
                        myViewHolder.setScrolling(newState == RecyclerView.SCROLL_STATE_DRAGGING ||
                                newState == RecyclerView.SCROLL_STATE_SETTLING);
                    }
                }
                recyclerView.invalidateItemDecorations(); // 通知RecyclerView重新绘制ItemDecoration
            }
        });
    }
}

以上代码示例中,我们通过自定义的ItemDecoration类来绘制分隔线,并在onDraw方法中判断Item是否处于滚动状态来决定是否绘制分隔线。在RecyclerView的滚动状态改变时,我们通过设置ViewHolder的isScrolling来标记Item的滚动状态,并调用RecyclerView的invalidateItemDecorations方法来重新绘制分隔线。

相关内容

热门资讯

透视了解!aapoker发牌逻... 透视了解!aapoker发牌逻辑(透视)果然存在有挂(详细辅助攻略教程)辅助器中分为三种模型:软件透...
免费测试版!aapoker怎么... 免费测试版!aapoker怎么提高中牌率,hhpoker买挂,安装教程(有挂技巧);aapoker怎...
透视模拟器!德普之星透视辅助软... 透视模拟器!德普之星透视辅助软件激活码(透视)都是存在有挂(详细辅助AI教程)1、德普之星透视辅助软...
玩家必用!菠萝辅助器免费版的特... 玩家必用!菠萝辅助器免费版的特点,we poker辅助器下载,详细教程(有挂透视);致您一封信;亲爱...
透视存在!wepoker线上大... 透视存在!wepoker线上大神(透视)切实存在有挂(详细辅助安装教程)1、上手简单,内置详细流程视...
一分钟了解!wpk俱乐部辅助器... 一分钟了解!wpk俱乐部辅助器,拱趴大菠萝挂,线上教程(有挂方法);1.wpk俱乐部辅助器 ai辅助...
透视透视挂!如何下载德普之星辅... 透视透视挂!如何下载德普之星辅助软件(透视)确实是真的有挂(详细辅助扑克教程);1、下载好辅助软件之...
最新技巧!we-poker辅助... 最新技巧!we-poker辅助,hhpoker是真的还是假的,系统教程(有挂方法)1、玩家可以在hh...
透视辅助!xpoker辅助(透... 透视辅助!xpoker辅助(透视)原来真的是有挂(详细辅助解密教程);1、透视辅助简单,软件透明挂操...
总算了解!wepoker免费透... 总算了解!wepoker免费透视脚本,wepoker怎么开辅助,2025新版(有挂教程)1、很好的工...