在onBindViewHolder之后,Recyclerview按钮状态发生变化

时间:2016-11-14 14:19:57

标签: android button timer android-recyclerview pressed

我有一个Recyclerview,其中viewholder构造函数中有一个onclicklistener按钮:

public ViewHolder(View itemView)
{
    super(itemView);
    ...
    button.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
          ...
        }
    }
}

每个项目也有倒计时,倒计时每秒递减一次,项目的进度条会更新以显示剩余时间。 计时器由runnable完成:

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);

它没有问题。有谁知道为什么会这样,我怎么能在没有记住所有状态的麻烦的情况下获得动画呢?

1 个答案:

答案 0 :(得分:0)

当您致电adapter.notifyItemChanged(items.indexOf(item));时,它会重新绑定该位置的视图,这是ViewHolder&amp;存储的新视图。没有紧迫的状态&amp;这就是它失去按钮状态的原因。

您可以使用OnTouchListener并按照您提到的那样存储状态来执行此操作。

由于我没有评论的声誉,所以我正在写作评论。