CountdownView icon indicating copy to clipboard operation
CountdownView copied to clipboard

recyvlerview头部设置此控件 一直被复用导致时间停止或错乱

Open Zerlinw opened this issue 8 years ago • 13 comments

Zerlinw avatar Dec 11 '17 03:12 Zerlinw

+1,怎么解决的

liguangze avatar Dec 19 '17 08:12 liguangze

@liguangze 我目前只能把时间器提出来到recyclerview外面去了,不被复用

Zerlinw avatar Dec 19 '17 08:12 Zerlinw

@Munccccc 怎么提取到外面,时间控件是在holder中获取的,时间值是服务器返回的,在什么时候设置,会报空的啊

liguangze avatar Dec 20 '17 01:12 liguangze

@liguangze 布局里面把时间器写到recyclerview的外面 不要到holer头部里面

Zerlinw avatar Dec 20 '17 01:12 Zerlinw

@Munccccc 不在recyclerview里面,那只会显示一个倒计时啊,我的需求是每个item都有倒计时

liguangze avatar Dec 20 '17 01:12 liguangze

CountdownView中的onDetachedFromWindow方法中调用了stop方法,注释这个stop方法,就能用了,在头视图中

xcatx9527 avatar Jan 02 '18 03:01 xcatx9527

在Adapter重写onViewAttachedToWindow()方法并且调用start(),然后在onDetachedFromWindow()方法中调用stop()方法就不会出现停止的现象了。onViewAttachedToWindow()方法是当适配器创建的view(即列表项view)被窗口分离(即滑动离开了当前窗口界面)就会被调用,onDetachedFromWindow是 当列表项出现到可视界面的时候调用。

RememberGpz avatar May 08 '18 07:05 RememberGpz

@xcatx9527 意思是继承CountdownView,然后重写onDetachedFromWindow方法,注释掉吗

manburenshenglu avatar Jun 04 '18 08:06 manburenshenglu

countView.addOnAttachStateChangeListener 在这个控件添加监听 然后在onViewAttachedToWindow()方法里面 再次调用start方法就OK了 改源码太麻烦了

Lonvik avatar Feb 15 '19 11:02 Lonvik

在Adapter重写onViewAttachedToWindow()方法并且调用start(),然后在onDetachedFromWindow()方法中调用stop()方法就不会出现停止的现象了。onViewAttachedToWindow()方法是当适配器创建的view(即列表项view)被窗口分离(即滑动离开了当前窗口界面)就会被调用,onDetachedFromWindow是 当列表项出现到可视界面的时候调用。

countView.addOnAttachStateChangeListener 添加监听 然后在onViewAttachedToWindow()方法里面 再次调用start方法就OK了 改源码太麻烦了

Lonvik avatar Feb 15 '19 11:02 Lonvik

CountdownView中的onDetachedFromWindow方法中调用了stop方法,注释这个stop方法,就能用了,在头视图中

countView.addOnAttachStateChangeListener 添加监听 然后在onViewAttachedToWindow()方法里面 再次调用start方法就OK了 改源码太麻烦了

Lonvik avatar Feb 15 '19 11:02 Lonvik

+1,怎么解决的

countView.addOnAttachStateChangeListener 添加监听 然后在onViewAttachedToWindow()方法里面 再次调用start方法就OK了 改源码太麻烦了

Lonvik avatar Feb 15 '19 11:02 Lonvik

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;

import java.util.Timer;
import java.util.TimerTask;

import cn.iwgang.countdownview.CountdownView;

/**
 * 新增计时器线程,用作实时记录倒计时的时间戳,修复原Countdown在<code>{@link #onDetachedFromWindow()}</code>方法中调用了{@code stop()}方法,
 * 但并没有在<code>{@link #onAttachedToWindow()}</code>方法中恢复计时的问题,并且,计时器也没有实时的记录运行中的准确数值。
 * <p/>
 * booooo 2018/11/23 11:49
 */
public class ZkCountdownView extends CountdownView
{
    public ZkCountdownView(Context context)
    {
        super(context);
    }

    public ZkCountdownView(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }

    public ZkCountdownView(Context context, AttributeSet attrs, int defStyleAttr)
    {
        super(context, attrs, defStyleAttr);
    }

    private long time = 0;
    private boolean isStartingTask = false;
    private final Timer mTimer = new Timer();
    private final TimerTask task = new TimerTask()
    {
        @Override
        public void run()
        {
            time -= 1000;
        }
    };

    @Override
    protected void onAttachedToWindow()
    {
        super.onAttachedToWindow();
        Log.d(ZkCountdownView.class.getSimpleName(), "onAttachedToWindow");
        this.start(time);
    }

    @Override
    public void start(long millisecond)
    {
        super.start(millisecond);
        time = millisecond;
        if (!isStartingTask)
        {
            Log.d(ZkCountdownView.class.getSimpleName(), "start timer time=" + time);
            mTimer.scheduleAtFixedRate(task, 0, 1000);
            isStartingTask = true;
        }
    }

    @Override
    public void updateShow(long ms)
    {
        super.updateShow(ms);
        time = ms;
    }

    public void finishTimer()
    {
        mTimer.cancel();
        Log.d(ZkCountdownView.class.getSimpleName(), "stop timer");
    }
}

Hiboboo avatar Nov 23 '19 06:11 Hiboboo