Android Drag-n-Move-如何避免RecyclerView背景填充整个屏幕,即使在那里';在RecyclerView中只有几个项目
目前,我正在根据和代码示例实现drag-n-move特性 结果是这样的 我希望在移动项目时,Android Drag-n-Move-如何避免RecyclerView背景填充整个屏幕,即使在那里';在RecyclerView中只有几个项目,android,android-recyclerview,Android,Android Recyclerview,目前,我正在根据和代码示例实现drag-n-move特性 结果是这样的 我希望在移动项目时,RecycleView的背景可见 这是我所做的改变 将背景色设置为红色-recyclerView.setBackgroundColor(color.red) 在项目上提供纯白颜色 <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_c
RecycleView
的背景可见
这是我所做的改变
recyclerView.setBackgroundColor(color.red)代码>
<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" />
但是,这没有什么区别。如果
RecyclerView
比屏幕上分配给它的区域长,则没有问题:只需将RecyclerView
的背景色设置为红色即可。但是,如果RecyclerView
中的项目没有填满布局中分配给RecyclerView
的空间,则您将在空白处看到红色背景。这就是你想要消除的
为此,在RecyclerView
上设置一个OnGlobalLayoutListener
,并检查是否有多余的空间。如果没有多余的空间,则只需将背景色设置为红色;否则,请创建一个填充红色且大小适当的位图可绘制的,以仅为屏幕上的项目提供背景,且不足以溢出到多余区域
下面是在您提到的项目的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;
}
以下是效果的视频:
如果实现了“滑动以删除”手势,则在删除项目时还必须调用侦听器。我还必须在RecyclerListAdapter
的onItemClear()
中将背景色设置为非零值
一种更简单的方法是定义一个可以设置为只在项目视图后面绘制的RecyclerView
背景的可绘制文件
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);
这也将用于刷卡删除。谢谢您的回答。你知道吗,当你向下移动一个项目时,它的相邻文本会先向上滑动,然后相邻的白色背景卡才会随后向上滑动。@CheokYanCheng这是因为项目有一个透明的背景。将白色背景应用于item_main
的FrameLayout
,红色背景将不会渗出。@CheokYanCheng我明白你的意思。外观与设置背景色不完全相同。解决方案可能会深入研究默认动画。根据您的要求,另一种选择是设置背景颜色,并用虚拟条目填充RecyclerView
,这样背景就不会显示在最后。也许只有一个大条目来涵盖最后一部分。
RecyclerViewBackground bg = new RecyclerViewBackground();
bg.attachRecyclerView(recyclerView);
recyclerView.setBackground(bg);