gpt4 book ai didi

android - Drag-n-Move - 即使 RecyclerView 中只有几个项目,如何避免 RecyclerView 背景填满整个屏幕

转载 作者:行者123 更新时间:2023-11-30 00:01:39 25 4
gpt4 key购买 nike

目前,我正在根据 https://medium.com/@ipaulpro/drag-and-swipe-with-recyclerview-6a6f0c422efd 实现拖动和移动功能和代码示例来自 https://github.com/iPaulPro/Android-ItemTouchHelper-Demo/

这是结果

enter image description here

我希望在移动项目时显示 RecycleView 的背景。

这是我所做的改变

  1. RecycleView 背景颜色设置为红色 - recyclerView.setBackgroundColor(Color.RED);

  2. 在项目上提供纯白色。

    <TextView
    android:id="@+id/text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical"
    android:layout_marginLeft="@dimen/activity_horizontal_margin"
    android:textAppearance="?android:attr/textAppearanceMedium" />

    <ImageView
    android:id="@+id/handle"
    android:layout_width="?listPreferredItemHeight"
    android:layout_height="match_parent"
    android:layout_gravity="center_vertical|right"
    android:scaleType="center"
    android:src="@drawable/ic_reorder_grey_500_24dp" />

这是我想要的结果。

enter image description here

但是,有 1 个缺点。当 RecyclerView 中只有几项时。那些空白区域也将被背景色填充。请看下面的截图。下面的 RecyclerView 只包含 3 个项目。

enter image description here

我试图让 RecyclerView 的高度 wrap_content

recyclerView.setLayoutParams(
new FrameLayout.LayoutParams(
FrameLayout.LayoutParams.MATCH_PARENT,
FrameLayout.LayoutParams.WRAP_CONTENT
)
);

但是,这没有什么区别。

最佳答案

如果 RecyclerView 比屏幕上分配给它的区域长,则没有问题:只需将 RecyclerView 的背景颜色设置为红色即可。但是,如果 RecyclerView 中的项目没有填满布局中分配给 RecyclerView 的空间,那么您将在空白区域看到红色背景。这就是您要消除的内容。

为此,在 RecyclerView 上设置一个 OnGlobalLayoutListener 并检查是否有多余空间。如果没有多余的空间,则将背景颜色设置为红色即可;否则,创建一个用红色填充且大小合适的 BitmapDrawable,以便为屏幕上的项目提供背景,并且不会大到溢出到多余区域。

这是在您提到的项目的 RecyclerListFragment 中完成此操作的代码。

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
final RecyclerView recyclerView = new RecyclerView(container.getContext());
recyclerView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
recyclerView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
if (recyclerView.getChildCount() == 0) {
return;
}

int lastChildBottom = recyclerView.getChildAt(recyclerView.getChildCount() - 1).getBottom();
if (lastChildBottom >= recyclerView.getHeight()) {
recyclerView.setBackgroundColor(Color.RED);
return;
}
Bitmap bitmap = Bitmap.createBitmap(recyclerView.getWidth(), lastChildBottom, Bitmap.Config.ARGB_8888);
bitmap.eraseColor(Color.RED);
BitmapDrawable d = new BitmapDrawable(getResources(), bitmap);
d.setGravity(Gravity.TOP);
recyclerView.setBackground(d);
recyclerView.invalidate();
}
});
return recyclerView;
}

效果视频如下:

enter image description here

如果您实现了滑动删除手势,则还必须在删除项目时调用监听器。我还必须在 RecyclerListAdapteronItemClear() 中将背景颜色设置为非零值。


一种更简单的方法是定义一个可以设置为 RecyclerView 背景的可绘制对象,它只在项目 View 后面绘制。

public class RecyclerViewBackground extends Drawable {
private RecyclerView mRecyclerView;
private Bitmap mBitmap;
private Paint mPaint;

RecyclerViewBackground() {
super();
mPaint = new Paint();
mPaint.setColor(Color.RED);
}

@Override
public void draw(Canvas canvas) {
if (mRecyclerView.getChildCount() == 0) {
return;
}

int bottom = mRecyclerView.getChildAt(mRecyclerView.getChildCount() - 1).getBottom();
if (bottom >= mRecyclerView.getHeight()) {
bottom = mRecyclerView.getHeight();
}
canvas.drawRect(0, 0, canvas.getWidth(), bottom, mPaint);
}

@Override
public void setAlpha(int alpha) {
}

@Override
public void setColorFilter(ColorFilter colorFilter) {
}

@Override
public int getOpacity() {
return PixelFormat.OPAQUE;
}

public void attachRecyclerView(RecyclerView recyclerView) {
mRecyclerView = recyclerView;
}
}

将此 Drawable 附加到 RecyclerView 如下:

RecyclerViewBackground bg = new RecyclerViewBackground();
bg.attachRecyclerView(recyclerView);
recyclerView.setBackground(bg);

这也将负责滑动删除。

关于android - Drag-n-Move - 即使 RecyclerView 中只有几个项目,如何避免 RecyclerView 背景填满整个屏幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49821458/

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