Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Drag-n-Move-如何避免RecyclerView背景填充整个屏幕,即使在那里';在RecyclerView中只有几个项目_Android_Android Recyclerview - Fatal编程技术网

Android Drag-n-Move-如何避免RecyclerView背景填充整个屏幕,即使在那里';在RecyclerView中只有几个项目

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

目前,我正在根据和代码示例实现drag-n-move特性

结果是这样的

我希望在移动项目时,
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);