У меня есть представление переработчика, где у каждого элемента есть таймер обратного отсчета, и может быть шанс, что несколько таймеров обратного отсчета завершатся одновременно. Что я хочу сделать, это удалить элементы, когда таймер заканчивается. Если есть только один элемент, то код работает абсолютно нормально, но когда их несколько, происходит сбой с исключением 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 перед запуском нового, но это не работает. Я попробовал еще одно решение с использованием обработчика, и оно прекрасно работало как таймер, но даже в том, что касалось удаления элемента, оно зависало. Просто чтобы еще раз уточнить, будет несколько таймеров, заканчивающихся в одно и то же время, и, таким образом, несколько элементов списка будут удалены одновременно, код должен быть в состоянии справиться с этим.
Любая помощь приветствуется. Благодарю.