我有一个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)
有什么想法吗?它可行吗?
谢谢!
答案 0 :(得分:7)
当真实标题滚出屏幕时,可见标题直接在画布上绘制,而不是像普通的交互式小部件。
您有这些选项
如果选择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(不仅仅是)。