我有一个Recyclerview,在viewholder构造函数中有一个按钮onclicklistener:
public ViewHolder(View itemView)
{
super(itemView);
...
button.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
...
}
}
}
每个项目也有一个倒计时,每秒钟倒计时递减,并更新项目的进度条以显示剩余时间。计时器是通过可运行的:
完成的。countdownHandler.postDelayed(countdownRunnable, 1000);
然后遍历所有项,减少倒计时并通知适配器:
countdownRunnable = new Runnable()
{
@Override
public void run()
{
Iterator<Item> iterator = countdownTasks.iterator();
while (iterator.hasNext())
{
item.decrementCountdown();
adapter.notifyItemChanged(items.indexOf(item));
}
if (countdownTasks.size() > 0)
countdownHandler.postDelayed(countdownRunnable, 1000);
}
}
这是我的问题,如果列表中只有一个项目,它也会发生。我按下按钮并处于按下状态,但当倒计时更新触发时,按钮不再按下。松开按钮并没有激活按钮。如果我去掉倒计时,它就能正常工作了。
我没有改变onBindViewHolder中的按钮,我没有滚动,因为只有一个项目。这是预期的行为,所有按钮被取消,只要notifyItemChanged被调用或我做错了什么?这是否与onClickListener一起工作,或者我是否需要一个onTouchListener并在项目中保存触地状态并在每次更新时重置它?
谢谢!
编辑:我发现,如果我设置
recyclerView.setItemAnimator(null);
它工作没有问题。有人知道为什么会这样吗?我怎么还能得到动画而不需要记住所有的状态?
当您调用adapter.notifyItemChanged(items.indexOf(item));
时,它会为该位置重新绑定视图,这是存储在ViewHolder
&不要有压力状态& &;这就是为什么它失去了按钮状态。
您可以通过使用OnTouchListener
和存储状态来做到这一点,正如您在问题中提到的。
我是作为回复写的,因为我没有评论的声誉。