要实现Android的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);
}
}
}
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;
}
}
}
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方法来重新绘制分隔线。