0

在我的recyclerView适配器中,我实现了简单的 CountDownTimer 15 秒,在这个实现中 countDownTimer 工作正常,在列表中recylcerview我在布局视图中有一些 countDownTimer 并且我想在具有 countDownTimer 的当前行再次启动时启动和停止这个 countDownTimer 并且当 countDownTimer 不是可见或未显示在列表中,必须停止。喜欢 Instagram 播放和停止视频

简化适配器:

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?

4

2 回答 2

1

您的代码的问题是,任何时候 aViewHolder被绑定然后从aRecyclerView中解除绑定CountDownTimer都会从头开始,除非ViewHoldera 没有回收,在这种情况下他们使用 a 的意义很小RecyclerView

您应该做的是删除Timerfrom的关联ViewHolder并将其附加到适配器列表。这样,您可以单独跟踪每个项目中计时器经过的时间。

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

于 2019-01-06T09:32:04.660 回答
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();

        }
    });
于 2019-01-06T10:29:39.223 回答