首页 文章

不能通过eowise捕捉Sticky Header(RecyclerView)的Child View的触摸事件

提问于
浏览
0

我在这里使用库"recyclerview-stickyheaders"链接:https://github.com/eowise/recyclerview-stickyheaders一切都好,我可以't catch touch event by .setOnHeaderClickListener(this) use StickyHeadersBuilder class. But I can' t,我不会工作 . *在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();
}
  • 在AdapterHeader中

公共类ViewHolder扩展了RecyclerView.ViewHolder实现了View.OnClickListener {RelativeLayout profile; 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 interface ClickListener {public void headerClicked(View view,int position); }

public void setClickListener(ClickListener clickListener)

  • 谢谢大家!

1 回答

  • 1

    这个库实际上并没有向屏幕添加任何视图 - 只将 pixel by pixel 视图复制到画布 . 这是代码:

    
    ```java
    canvas.save();
    canvas.translate(0, y);
    header.draw(canvas);
    canvas.restore();
    
    
    所以你的 Headers 实际上并不在屏幕上 - 只是它的视觉克隆 . 
    
    可以处理父视图上的点击 - 请参阅[library](https://github.com/timehop/sticky-headers-recyclerview/blob/master/library/src/main/java/com/timehop/stickyheadersrecyclerview/StickyRecyclerHeadersTouchListener.java)(看起来几乎相同)
    
    但是从父视图来看,将click事件发送给子节点(例如按钮)将非常困难 . 当然没有动画,因为你看到的实际上不是视图 .

相关问题