如何处理RecyclerView.ItemDecoration中的点击事件?

时间:2015-06-28 17:38:17

标签: android android-recyclerview android-viewholder

我有一个RecyclerView(带有LinearLayoutManager)和一个自定义的RecyclerView.ItemDecoration。

让我们说,我想在装饰视图中有按钮(出于某种原因......)。

我用按钮膨胀布局,它正确绘制。但我无法点击按钮。如果我按下它,没有任何事情发生(它保持不变,没有按下效果)并且onClick事件没有触发。

ItemDecoration布局的结构是

 <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <layer-list>
            <item>
                <bitmap android:gravity="fill" android:src="@drawable/ic_remote_soundlow_keypressed"  />
            </item>

        </layer-list>
    </item>

    <item android:state_enabled="true">
        <layer-list>
            <item>
                <bitmap android:gravity="fill" android:src="@drawable/ic_remote_soundlow" />
            </item>

        </layer-list>
    </item>

</selector>

我试图在装饰的ViewHolder中设置监听器

<LinearLayout>
  <TextView/>
  <Button/>
</LinearLayout>

我正在onDrawOver方法中绘制装饰。 (实际上,我正在修改此代码库:https://github.com/edubarr/header-decor

有什么想法吗?它可行吗?

谢谢!

3 个答案:

答案 0 :(得分:7)

当真实标题滚出屏幕时,可见标题直接在画布上绘制,而不是像普通的交互式小部件。

您有这些选项

  1. 覆盖RecyclerView.onInterceptTouchEvent(),虽然有一些侵入性,所以我更喜欢下一个。
  2. 使用RecyclerView.addOnItemTouchListener(),记住运动事件参数已被翻译成RecyclerView的坐标系。
  3. 使用真实的标题视图,但我想这会有点远。
  4.   

    如果选择1/2,Button.setPressed(true)并重新绘制标题将具有视觉效果。

答案 1 :(得分:2)

除了Neil所说的, 这里的答案可能有所帮助。  Passing MotionEvents from RecyclerView.OnItemTouchListener to GestureDetectorCompat

然后你只需要计算标题的高度,看看点击是否落在那个标题视图上并自己处理事件。

private class RecyclerViewOnGestureListener extends GestureDetector.SimpleOnGestureListener {
    @Override
    public boolean onSingleTapConfirmed(MotionEvent e) {
        float touchY = e.getY();



        ALLog.i(this, "Recyclerview single tap confirmed y: " + touchY);
        //mGroupHeaderHeight is the height of the header which is used to determine whether the click is inside of the view, hopefully it's a fixed size it would make things easier here 
        if(touchY < mGroupHeaderHeight) {
            int itemAdapterPosition = mRecyclerView.getLayoutManager().getPosition(mRecyclerView.findChildViewUnder(0, mGroupHeaderHeight));

            //Do stuff here no you have the position of the item that's been clicked
            return true;
        }
        return super.onSingleTapConfirmed(e);

    }

    @Override
    public boolean onDown(MotionEvent e) {
        float touchY = e.getY();

        if(touchY < mGroupHeaderHeight) {
            return true;
        }
        return super.onDown(e);
    }

    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        float touchY = e.getY();

        if(touchY < mGroupHeaderHeight) {
            return true;
        }
        return super.onSingleTapUp(e);
    }
}

答案 2 :(得分:0)

正如尼尔指出的那样,事情变得越来越复杂。但是根据定义,你不能。

那么,为什么不包括这样做的好图书馆呢? 我在我的FlexibleAdapter项目中为可点击的粘贴标题提出了我的辛勤工作,它使用真实视图(不是装饰器)来处理粘贴时标题上的点击事件。

这部分还有一个工作演示和Wiki page(不仅仅是)。