Android RecyclerView - 无法看到涟漪效应,因为另一个Activity已启动

时间:2018-01-06 12:53:55

标签: android android-recyclerview

我有RecycleView个自定义行。点击一行是通过RecyclerView.OnItemTouchListener处理的。

我的自定义行设置了涟漪效果:

android:clickable="true"
android:focusable="true"
android:background="@drawable/list_item_bg"

一切都按预期工作,我可以看到涟漪效应。 但是......当我点击一行时我开始一个新的Activity,它会立即启动并且涟漪效应不再可见。

有没有办法,所以新的Activity只能在涟漪动画之后运行?

OnItemTouchListener.java

public class RecyclerTouchListener implements RecyclerView.OnItemTouchListener {

    private GestureDetector gestureDetector;
    private RecyclerClickListener clickListener;

    public RecyclerTouchListener(Context context, final RecyclerView recyclerView, final RecyclerClickListener clickListener) {
        this.clickListener = clickListener;
        gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                return true;
            }

            @Override
            public void onLongPress(MotionEvent e) {
                View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
                if (child != null && clickListener != null) {
                    clickListener.onLongClick(child, recyclerView.getChildPosition(child));
                }
            }
        });
    }

    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {

        View child = rv.findChildViewUnder(e.getX(), e.getY());
        if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) {
            clickListener.onClick(child, rv.getChildPosition(child));
        }
        return false;
    }

    @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent e) {
    }

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
    }
}

@绘制-V21 / list_item_bg.xml

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="@color/green_dark">
    <item>
        <shape>
            <corners android:radius="2dp"/>
            <solid android:color="@color/green"/>
        </shape>
    </item>
    <item android:id="@android:id/mask">
        <shape>
            <solid android:color="@android:color/white"/>
            <corners android:radius="5dp"/>
        </shape>
    </item>

</ripple>

2 个答案:

答案 0 :(得分:0)

解决问题的最简单方法是延迟行动的效果。

// onClick
yourView.postDelayed(new Runnable(){
    @Override
    public void run(){
        yourContext.startActivity(new Intent(yourContext, YourActivity.class)
            /*.putExtra(...)*/);
    }
}, ANIMATION_DURATION_MILLIS);

注意:您可能需要使用一些布尔标志来防止多次点击。

答案 1 :(得分:0)

您可以使用Handler并在转到新活动之前添加一些延迟,以便可以看到Ripple动画

<强>代码

 @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {

        View child = rv.findChildViewUnder(e.getX(), e.getY());
        if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) {

            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    clickListener.onClick(child, rv.getChildPosition(child)); //perform Task
                }
            }, 1000);  //dealy Time
        }
        return false;
    }

更好更清洁的方法是使用View.OnClickListener代替Touch。它将首先自动显示动画。

这是好Example