4

我注意到了这些库,并渴望在我的应用程序中使用它们。我的RecyclerView用途StaggeredGridLayoutManager是组织viewHolders,我写下了以下代码:

ItemTouchHelper helper = new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(
            ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.START | ItemTouchHelper.END,
            ItemTouchHelper.START | ItemTouchHelper.END) {
        @Override
        public boolean onMove(RecyclerView recyclerView,
                              RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
            mAdapter.move(viewHolder.getAdapterPosition(), target.getAdapterPosition());
            return true;
        }

        @Override
        public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
            mAdapter.remove(viewHolder.getAdapterPosition());
        }
    });
    helper.attachToRecyclerView(mRecyclerView);

有两个问题:

  1. 滑动一个项目不会改变它alpha的 by deltaX

  2. 想象一下RecyclerView(有 2 列)中有 3 个项目:

    • 第一个是中号;
    • 第二个小于第一个;
    • 第三个是最大的。

如果我将第三个移动到第一个位置,向下滚动RecyclerView(其他项目不会影响前三个)然后向上滚动,第二个和第三个将完全一样。

看来我应该编写一个自定义ItemTouchHelper添加alpha动画来解决第一个问题,而我没有正确使用这些类,从而导致了第二个问题。

因此,什么是最适合使用的样本ItemTouchHelper?或者如何实现一个定制的?提前感谢您的任何答案或评论。

4

1 回答 1

3

根据ItemTouchHelper.Callback您想要覆盖方法onChildDrawonChildDrawOver那些 dX、dY 值的注释。

另请参阅(这是什么和调用)getDefaultUIUtil的实现。的注释演示了如何将它与覆盖和一起使用(即使示例错误地返回一个布尔值以进行处理)。ItemTouchUIUtilonChildDrawonChildDrawOvergetDefaultUIUtilonChildDrawonChildDrawOver

如果您想在 Lollipop 中的默认高程上添加 5,这是一个简单的示例:

    @Override
    public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
        super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);

        if (Build.VERSION.SDK_INT >= 21 && isCurrentlyActive && !isElevated) {
            final float newElevation = 5f + ViewCompat.getElevation(viewHolder.itemView);
            ViewCompat.setElevation(viewHolder.itemView, newElevation);
            isElevated = true;
        }
    }

    @Override
    public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        super.clearView(recyclerView, viewHolder);
        isElevated = false;
    }
于 2015-06-29T18:21:54.337 回答