发布
社区首页 >问答首页 >在可见性中启动和停止CountDownTimer重新查看项目

在可见性中启动和停止CountDownTimer重新查看项目
EN

Stack Overflow用户
提问于 2019-01-06 16:56:11
回答 2查看 374关注 0票数 0

在我的recyclerView适配器中,我实现了15秒的简单CountDownTimer,在这个实现中countDownTimer工作得很好,在recylcerview列表中,我在布局视图中有一些countDownTimer,当当前行有countDownTimer再次启动时,我想启动和停止这个countDownTimer,当countDownTimer不可见或它没有显示在列表中时,必须停止。类似于Instagram播放和停止视频

简化的适配器:

代码语言:javascript
代码运行次数:0
复制
public class InstagramFeedsAdapter extends RecyclerView.Adapter<InstagramFeedsAdapter.InstagramFeedsViewHolder> {
    ...

@Override
public void onBindViewHolder(final InstagramFeedsViewHolder holder, int position) {
    holder.bind(position);
}


public class InstagramFeedsViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    ...
    private boolean expanded;
    private CountDownTimer timer;

    public InstagramFeedsViewHolder(View itemView) {
        super(itemView);
        itemView.setOnClickListener(this);
        ButterKnife.bind(this, itemView);
    }

    @Override
    public void onClick(View v) {
    }

    public void bind(int position) {
        if (timer != null) {
            timer.cancel();
        }

        timer = new CountDownTimer(15000, 1000) {
            @SuppressLint("DefaultLocale")
            @Override
            public void onTick(long leftTimeInMilliseconds) {
                pager_count_down_timer.setVisibility(View.VISIBLE);
                long seconds = leftTimeInMilliseconds / 1000;
                pager_count_down_timer.setText(String.format("%02d", seconds % 60));
            }

            @Override
            public void onFinish() {
                pager_count_down_timer.setVisibility(View.GONE);
                timer = null;
            }
        }.start();
    }
}

现在,我如何在可见性项目上启动和停止此countDownTimer?

EN

回答 2

Stack Overflow用户

发布于 2019-01-06 17:32:05

代码的问题是,任何时候绑定ViewHolder,然后从RecyclerView解除绑定,CountDownTimer都会从头开始,除非ViewHolder没有回收,在这种情况下,使用RecyclerView的意义很小。

您应该做的是从ViewHolder中删除Timer的关联,并将其附加到适配器列表。这样,您就可以分别跟踪计时器在每个项目中经过了多少时间。

您可以使用onViewAttachedToWindow(VH holder)onViewDetachedFromWindow(VH holder)RecyclerView.Adapter中启动或停止/暂停Timer,然后可以使用getAdapterPosition()更新适配器列表。

票数 1
EN

Stack Overflow用户

发布于 2019-01-06 18:29:39

代码语言:javascript
代码运行次数:0
复制
instagram_feeds.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);

            int firstVisibleItem = layoutManager.findFirstCompletelyVisibleItemPosition();
            if (lastPos == firstVisibleItem) {
                return; //to prevent timer to restart if row position not changed
            }

            lastPos = firstVisibleItem;
            if (mCounter != null) {
                mCounter.cancel();

            }

                final InstagramFeedsAdapter.InstagramFeedsViewHolder vh = (InstagramFeedsAdapter.InstagramFeedsViewHolder) instagram_feeds
                        .findViewHolderForAdapterPosition(firstVisibleItem);
                mCounter = new CountDownTimer(15000, 1000) {
                    @SuppressLint("DefaultLocale")
                    @Override
                    public void onTick(long leftTimeInMilliseconds) {
                        vh.pager_count_down_timer.setVisibility(View.VISIBLE);
                        long seconds = leftTimeInMilliseconds / 1000;
                        vh.pager_count_down_timer.setText(String.format("%02d", seconds % 60));
                    }

                    @Override
                    public void onFinish() {
                        vh.pager_count_down_timer.setVisibility(View.GONE);
                        mCounter = null;
                    }
                }.start();

        }
    });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54060020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档