我正在尝试在RecyclerView.Adapter中垂直设置一组视图,动画效果很好,使用android:clipChildren =“false”,android:clipToPadding =“false”和viewHolder.linear.postInvalidate(),但是动画结束后,ClickListener不起作用。我正在使用ObjectAnimator因为我读了这个链接Android Animation - Button stays clickable
一些代码
@Override
public void onBindViewHolder(final TViewHolder viewHolder, int i) {
viewHolder.flGroupButtons.postInvalidate();
viewHolder.iv1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//not working
});
..... clicklisteners
viewHolder.iv4.setOnClickListener(new View.OnClickListener() {
PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX", 1f);
PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat("scaleY", 1f);
PropertyValuesHolder pvTranslativ1 = PropertyValuesHolder.ofFloat("translationY", viewHolder.iv1.getY() - (measureHeight * 5));
ObjectAnimator animatoriv1 = ObjectAnimator.ofPropertyValuesHolder(viewHolder.iv1, scaleX, scaleY, pvTranslativ1);
animatoriv1.setInterpolator(new DecelerateInterpolator());
animatoriv1.setDuration(300);
....
......
AnimatorSet as = new AnimatorSet();
as.playTogether(animatoriv1, animatoriv2, animatoriv3, animatoriv4);
as.start();
});
}
当没有折叠时,只有iv1 clicklistener正在工作。 我怎样才能让它发挥作用?
答案 0 :(得分:1)
您不能这样做,因为这不是Android触摸事件处理的工作方式。
ViewGroup或它的子类(FrameLayout,RelativeLayout,LinearLayout等)根据子视图的框架将触摸事件发送到它的子视图。因此,当您单击iv2或iv3或iv4时,触摸事件甚至没有传递给父视图( RecyclerView的项目),因此父视图从未进行过更改以处理或将触摸事件发送到iv2或iv3或iv4。
你应该做的是使用WindowManager在其中使用iv1-iv4弹出一个新窗口,并仔细计算位置,使其看起来就像你对RecyclerView项目所做的那样。然后你就可以收到touchevent和onClick事件
Facebook Reactions肯定使用WindowManager弹出一个带有按钮的新窗口:
答案 1 :(得分:0)
clicklistener位于错误的位置,它应该在viewholder
中// Adapter
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int type) {
return NewsViewHolder.newInstance(parent);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
final NewsEntry newsEntity = news.get(position);
((NewsViewHolder) holder).bind(newsEntity);
}
// ViewHolder
public NewsViewHolder(NewsViewHolderBinding binding) {
super(binding.getRoot());
itemView.findViewById(R.id.viewname).setOnClickListener(this);
}