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

UICollectionView 隐藏/防止单元格在 Sticky Header 后面滚动

iOS UITableView 类似 Flex Air 的 Sticky Header Index 列表