RecyclerView使用下面的视图滑动

Eug*_*e H 45 android android-recyclerview

我一直在做一些研究,我还没有找到一个示例或实现,允许您在刷卡时将视图(下面的示例图像)放在RecyclerView下面.有没有人有任何关于如何在使用库的情况下实现它的示例或想法.

这是我如何实现轻扫以解雇.

ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {

    @Override
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
        return false;
    }

    @Override
    public int getSwipeDirs(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        return super.getSwipeDirs(recyclerView, viewHolder);
    }

    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
        if (viewHolder instanceof ViewDividers) {
            Log.e("DIRECTION", direction + "");
        }
    }
};
new ItemTouchHelper(simpleItemTouchCallback).attachToRecyclerView(recycler);
Run Code Online (Sandbox Code Playgroud)

以下是Google收件箱的示例: 在此输入图像描述

Sim*_*mon 28

我对如何完成这一操作的理解是,可以在xml中放置两个视图,这些视图将在您的recyclerview中按行显示.

例如,这将是我的适配器:

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    public static class ExampleViewHolder extends RecyclerView.ViewHolder {
        public TextView background;
        public TextView foreground;

        public ExampleViewHolder(View v) {
            super(v);
            background = (TextView) v.findViewById(R.id.background);
            foreground = (TextView) v.findViewById(R.id.foreground);
        }

        @Override
        public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
            if (holder instanceof ExampleViewHolder) {
                ((ExampleViewHolder) holder).background.setBackgroundColor(); // do your manipulation of background and foreground here.
            }
        }

        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent,
                                                          int viewType) {

            View v = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.example, parent, false);
            return new ExampleViewHolder(v);
        }


    }
}
Run Code Online (Sandbox Code Playgroud)

recyclerview中的每一行都是从R.layout.example中提取xml布局.因此,要在下面创建视图,您可以使用relativelayout或framelayout在彼此之上创建视图:

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/background"
        />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/foreground"/>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

然后,如果您不想使用库进行滑动,则可以从Google复制此类,然后由Bruno Romeu Nunes修改:

https://github.com/heruoxin/Clip-Stack/blob/master/app/src/main/java/com/catchingnow/tinyclipboardmanager/SwipeableRecyclerViewTouchListener.java

该类将要求您创建一个滑动侦听器:

swipeTouchListener =
        new SwipeableRecyclerViewTouchListener(mRecyclerView,
                new SwipeableRecyclerViewTouchListener.SwipeListener() {
                    @Override
                    public boolean canSwipe(int position) {
                        if (position == totalPost.size() - 1 && !connected) {
                            return false;
                        }
                        return true;
                    }

                    @Override
                    public void onDismissedBySwipeLeft(RecyclerView recyclerView, int[] reverseSortedPositions) {
                        for (int position : reverseSortedPositions) {
                            //change some data if you swipe left
                        }
                        myAdapter.notifyDataSetChanged();
                    }

                    @Override
                    public void onDismissedBySwipeRight(RecyclerView recyclerView, int[] reverseSortedPositions) {
                        for (int position : reverseSortedPositions) {
                            //change some data if you swipe right
                        }
                        myAdapter.notifyDataSetChanged();
                    }
                });
Run Code Online (Sandbox Code Playgroud)

然后只需将其与您的recyclerview链接:

    mRecyclerView.addOnItemTouchListener(swipeTouchListener);
Run Code Online (Sandbox Code Playgroud)

  • 我不太确定这是怎么回事.当您滑动回收单元格项目时,您将滑动整个视图而不是框架的顶部.因此,您总是会将背景视图与前景一起滑开.@Simon你有这个工作的例子吗? (9认同)

eri*_*rik 11

我正在调查同样的问题.
我最终做的是,在包含recyclerView的布局中,我添加了一个简单的FrameLayout名为'swipe_bg',其高度与我的一个RecyclerView.ViewHolder项目相同.我将其可见性设置为"已消失",并将其放置在RecyclerView

然后在我设置的活动中ItemTouchHelper,我重写onChildDraw,就像这样..

ItemTouchHelper.SimpleCallback swipeCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT) {

    @Override
    public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
         View itemView = viewHolder.itemView;
         swipe_bg.setY(itemView.getTop());
         if (isCurrentlyActive) {
             swipe_bg.setVisibility(View.VISIBLE);
         } else {
             swipe_bg.setVisibility(View.GONE);
         }
         super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
    }
};
Run Code Online (Sandbox Code Playgroud)

不知道这是不是最好的方式,但似乎是最简单的方法.

  • 你如何在这里访问swipe_bg? (3认同)

Ali*_*our 5

我喜欢@erik方法但我建议通过Canvas将你想要的东西绘制到onChildDraw()函数.例如项目背景或图标.

@Override 
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
    final ColorDrawable background = new ColorDrawable(Color.RED);
    background.setBounds(0, itemView.getTop(),   itemView.getLeft() + dX, itemView.getBottom());
    background.draw(c);

    super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
}
Run Code Online (Sandbox Code Playgroud)

在这种方法中,您将根据需要绘制所需内容,而无需夸大未使用的视图