Несколько таймеров обратного отсчета, заканчивающихся одновременно в представлении переработчика - PullRequest
0 голосов
/ 07 мая 2018

У меня есть представление переработчика, где у каждого элемента есть таймер обратного отсчета, и может быть шанс, что несколько таймеров обратного отсчета завершатся одновременно. Что я хочу сделать, это удалить элементы, когда таймер заканчивается. Если есть только один элемент, то код работает абсолютно нормально, но когда их несколько, происходит сбой с исключением indexoutofbounds. Я пробовал разные решения, упомянутые при переполнении стека, но ни одно из них не помогло мне удалить представление.

Вот мой код адаптера.

public class UpcomingContestRecyclerAdapter extends RecyclerView.Adapter<UpcomingContestRecyclerAdapter.ViewHolder> {

private Context context;
private ArrayList<LiveAndUpcomingContest> live_and_upcoming_contest;
private Activity activity;

//Constructor
public UpcomingContestRecyclerAdapter(Activity context, ArrayList<LiveAndUpcomingContest> live_and_upcoming_contest) {
    // TODO Auto-generated constructor stub
    this.context = context;
    this.live_and_upcoming_contest = live_and_upcoming_contest;
    this.activity = context;
}


@Override
public UpcomingContestRecyclerAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.upcoming_contests_list_item, viewGroup, false);
    return new ViewHolder(view);
}

// Initialize the viewholder class.
public class ViewHolder extends RecyclerView.ViewHolder{
    CountDownTimer timer;
    private TextView game_countdown;

 public ViewHolder(View view) {
        super(view);
        game_countdown = view.findViewById(R.id.game_countdown);
}
}

@Override
public void onBindViewHolder(final UpcomingContestRecyclerAdapter.ViewHolder viewHolder, final int position) {

    if(viewHolder.timer!= null)
    {
        viewHolder.timer.cancel();

    }
    //Start countdown timer on the game countdown view.
    viewHolder.timer = new CountDownTimer(live_and_upcoming_contest.get(position).getStart_time(), 500) {
        public void onTick(long millisUntilFinished) {
            long secondsInMilli = 1000;
            long minutesInMilli = secondsInMilli * 60;
            long hoursInMilli = minutesInMilli * 60;

            long elapsedHours = millisUntilFinished / hoursInMilli;
            millisUntilFinished = millisUntilFinished % hoursInMilli;

            long elapsedMinutes = millisUntilFinished / minutesInMilli;
            millisUntilFinished = millisUntilFinished % minutesInMilli;

            long elapsedSeconds = millisUntilFinished / secondsInMilli;

            String yy = String.format("%02d:%02d:%02d", elapsedHours, elapsedMinutes, elapsedSeconds);
            viewHolder.game_countdown.setText(yy);
        }

        public void onFinish() {
            viewHolder.game_countdown.setText("00:00:00");
            live_and_upcoming_contest.remove(position);
            notifyDataSetChanged();
        }
    }.start();
}

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

Любая помощь приветствуется. Благодарю.

...