Запуск и остановка CountDownTimer в элементах recylcerview видимости - PullRequest
0 голосов
/ 06 января 2019

В моем 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 для элементов видимости?

Ответы [ 2 ]

0 голосов
/ 06 января 2019
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 голосов
/ 06 января 2019

Проблема с вашим кодом заключается в том, что каждый раз, когда ViewHolder связывается, а затем не связывается с RecyclerView, CountDownTimer запускается снова с нуля, если ViewHolder не перерабатывается, и в этом случае их очень мало используя RecyclerView.

Что вам нужно сделать, это удалить ассоциацию Timer из ViewHolder и присоединить ее к списку адаптеров. Таким образом, вы можете отслеживать, сколько таймера прошло в каждом элементе в отдельности.

Вы можете использовать onViewAttachedToWindow(VH holder) и onViewDetachedFromWindow(VH holder) в RecyclerView.Adapter, чтобы запустить или остановить / приостановить Timer, а затем вы можете использовать getAdapterPosition() для обновления списка адаптеров.

...