无法通过 eowise 捕获 Sticky Header (RecyclerView) 的 Child 视图的触摸事件
Can't catch touch event of Child View of Header of Sticky Header (RecyclerView) by eowise
我在这里使用库 "recyclerview-stickyheaders" link : https://github.com/eowise/recyclerview-stickyheaders
一切正常,我无法通过 .setOnHeaderClickListener(this) 使用 StickyHeadersBuilder class 捕捉触摸事件。但是我不能也不知道如何为 "header" 的 child 视图实现点击监听器(文本视图,header 中的按钮),在这种情况下是 btnFollow。它总是捕获整个 "header" 的触摸事件。我尝试在 ( HeaderAdapter ) 上为 Header 的 class 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();
}
在适配器中Header
public class ViewHolder 扩展 RecyclerView.ViewHolder 实现 View.OnClickListener{
RelativeLayout 配置文件;
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());
}
}
}
public 接口 ClickListener {
public void headerClicked(View view, int position);
}
public void setClickListener(ClickListener clickListener) {
this.clickListener = clickListener;
}
谢谢大家!
该库实际上并未向屏幕添加任何视图 - 仅将 逐像素 视图复制到 canvas。这是代码:
```
canvas.save();
canvas.translate(0, y);
header.draw(canvas);
canvas.restore();
```
因此您的 header 实际上并未出现在屏幕上 - 只是视觉克隆。
可以处理 parent 视图上的点击 - 请参阅此 library(看起来几乎相同)
但从 parent 来看,将点击事件发送到 child(例如中的按钮)将极其困难。当然没有动画,因为你看到的实际上不是视图。
我在这里使用库 "recyclerview-stickyheaders" link : https://github.com/eowise/recyclerview-stickyheaders 一切正常,我无法通过 .setOnHeaderClickListener(this) 使用 StickyHeadersBuilder class 捕捉触摸事件。但是我不能也不知道如何为 "header" 的 child 视图实现点击监听器(文本视图,header 中的按钮),在这种情况下是 btnFollow。它总是捕获整个 "header" 的触摸事件。我尝试在 ( HeaderAdapter ) 上为 Header 的 class 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();
}
在适配器中Header
public class ViewHolder 扩展 RecyclerView.ViewHolder 实现 View.OnClickListener{ RelativeLayout 配置文件; 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()); } }
} public 接口 ClickListener { public void headerClicked(View view, int position); }
public void setClickListener(ClickListener clickListener) { this.clickListener = clickListener; }
谢谢大家!
该库实际上并未向屏幕添加任何视图 - 仅将 逐像素 视图复制到 canvas。这是代码:
```
canvas.save();
canvas.translate(0, y);
header.draw(canvas);
canvas.restore();
```
因此您的 header 实际上并未出现在屏幕上 - 只是视觉克隆。
可以处理 parent 视图上的点击 - 请参阅此 library(看起来几乎相同)
但从 parent 来看,将点击事件发送到 child(例如中的按钮)将极其困难。当然没有动画,因为你看到的实际上不是视图。