如何使用ItemTouchHelper及其回调或实现自定义的?

时间:2015-06-11 10:32:21

标签: android android-support-library android-recyclerview android-support-design

我注意到这些库并且急于在我的应用中使用它们。 我的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更改为deltaX

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

    • 第一个是中等大小的;
    • 第二个小于第一个;
    • 第三个是最大的。
  3. 如果我将第三个移动到第一个位置,请向下滚动RecyclerView(其他项目不会影响前三个)然后向上,第二个和第三个将完全同样的。

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

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

1 个答案:

答案 0 :(得分:2)

根据ItemTouchHelper.Callback中的评论,您希望为这些dX,dY值覆盖方法onChildDrawonChildDrawOver

另请参阅getDefaultUIUtil以及ItemTouchUIUtil的实施(onChildDrawonChildDrawOver调用的内容)。 getDefaultUIUtil的评论演示了如何将其与覆盖onChildDrawonChildDrawOver结合使用(即使示例错误地返回bool值进行处理)。

如果您想在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;
    }