eowise 无法捕获 Sticky Header (RecyclerView) 的子视图的触摸事件
Posted
技术标签:
【中文标题】eowise 无法捕获 Sticky Header (RecyclerView) 的子视图的触摸事件【英文标题】:Can't catch touch event of Child View of Header of Sticky Header (RecyclerView) by eowise 【发布时间】:2015-07-18 20:56:18 【问题描述】:我在这里使用库“recyclerview-stickyheaders”链接:https://github.com/eowise/recyclerview-stickyheaders 一切都很好,我无法通过 .setOnHeaderClickListener(this) 使用 StickyHeadersBuilder 类来捕捉触摸事件。但我不能也不知道如何为“标题”的子视图(文本视图,标题中的按钮)实现点击监听器,在这种情况下是 btnFollow。它总是捕获整个“标题”的触摸事件。我尝试为( HeaderAdapter )上的 Header 类 ViewHolder 实现单击侦听器,但它不起作用。 * 在 MainActivity 中:
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = (RecyclerView) findViewById(R.id.rv_timeline);
adapterRecyclerView = new AdapterRecyclerTimeline(getApplicationContext(), getData());
adapterRecyclerView.setClickListener(this);
recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
recyclerView.setItemAnimator(new DefaultItemAnimator());
adapterHeader = new AdapterTimelineHeader(getApplicationContext(), getData());
adapterHeader.setClickListener(this);
recyclerHeader = new StickyHeadersBuilder()
.setAdapter(adapterRecyclerView)
.setRecyclerView(recyclerView)
.setStickyHeadersAdapter(adapterHeader)
.setOnHeaderClickListener(this)
.build();
recyclerView.setAdapter(adapterRecyclerView);
recyclerView.addItemDecoration(recyclerHeader);
@Override
public void onHeaderClick(View header, long headerId)
Toast.makeText(getApplicationContext(), "Header Clicked LIB", Toast.LENGTH_SHORT).show();
@Override
public void headerClicked(View view, int position)
Toast.makeText(getApplicationContext(), "Header Clicked MANUAL", Toast.LENGTH_SHORT).show();
在适配器头中
公共类 ViewHolder 扩展 RecyclerView.ViewHolder 实现 View.OnClickListener 相对布局配置文件; TextView tvProfileName; TextView btnFollow;
public ViewHolder(View itemView)
super(itemView);
profile = (RelativeLayout) itemView.findViewById(R.id.profile);
tvProfileName = (TextView) itemView.findViewById(R.id.tv_profile_name);
btnFollow = (TextView) itemView.findViewById(R.id.btn_follow);
btnFollow.setOnClickListener(this);
L.m("Set Listener FOLLOW");
@Override
public void onClick(View v)
if (clickListener != null)
L.m("Do Click FOLLOW");
clickListener.headerClicked(v, getPosition());
公共接口 ClickListener public void headerClicked(View view, int position);
public void setClickListener(ClickListener clickListener) this.clickListener = clickListener;
谢谢大家!
【问题讨论】:
【参考方案1】:这个库实际上并不向屏幕添加任何视图 - 只是将逐像素视图复制到画布。代码如下:
```
canvas.save();
canvas.translate(0, y);
header.draw(canvas);
canvas.restore();
```
所以你的标题实际上并没有出现在屏幕上——只是它的视觉克隆。
可以处理对父视图的点击 - 请参阅library(看起来几乎相同)
但是从父视图来看,将点击事件发送给孩子(例如按钮)将非常困难。当然没有动画,因为你看到的实际上不是视图。
【讨论】:
以上是关于eowise 无法捕获 Sticky Header (RecyclerView) 的子视图的触摸事件的主要内容,如果未能解决你的问题,请参考以下文章
Android Sticky header RecyclerView/ Section Header RecyclerView
css Sticky Header che varia allo scroll
markdown Venture - Sticky Mobile Header,顶部有公告栏
css 如何在Genesis中设置Sticky Header或Navigation