多个倒计时器回收者视图

时间:2017-07-22 12:18:40

标签: android android-recyclerview countdowntimer

我遇到多个倒计时器和循环视图的问题。当我添加新计时器时,前一个计时器停止。然后它非常奇怪,当秒数相同时,许多计时器可以一次工作。我搜索了很多,但没有找到我的问题的解决方案。请帮帮我

我的持有人班级

public class MyViewHolder  extends RecyclerView.ViewHolder{

private long timeCountInMilliSeconds = 1 * 60000;

private enum TimerStatus {
    STARTED,
    STOPPED
}

public TextView title;
private TimerStatus timerStatus = TimerStatus.STOPPED;
private ProgressBar progressBarCV;
public TextView textViewTimeCV;
private CountDownTimer countDownTimer;
private Handler handler;

public MyViewHolder(View view) {
    super(view);

    initViews(view);
}

private void initViews(View view) {
    title = (TextView) view.findViewById(R.id.title);
    progressBarCV = (ProgressBar) view.findViewById(R.id.progressBarCV);
    textViewTimeCV = (TextView) view.findViewById(R.id.textViewTimeCV);
}

public void startStop(String minutes) {
    if (timerStatus == TimerStatus.STOPPED) {


        // call to initialize the timer values
        setTimerValues(minutes);
        // call to initialize the progress bar values
        setProgressBarValues();
        // changing the timer status to started
        timerStatus = TimerStatus.STARTED;
        // call to start the count down timer
        startCountDownTimer();

    } else {

        // changing the timer status to stopped
        timerStatus = TimerStatus.STOPPED;
        stopCountDownTimer();
    }
}

private void setTimerValues(String minutes) {
    int time = 0;
    if (!minutes.isEmpty() || Integer.parseInt(minutes) != 0) {

        time = Integer.parseInt(minutes);
    }

    // assigning values after converting to milliseconds
    timeCountInMilliSeconds = time * 60 * 1000;
}

private void startCountDownTimer() {
    handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            countDownTimer = new CountDownTimer(timeCountInMilliSeconds, 1000) {
                @Override
                public void onTick(long millisUntilFinished) {

                    textViewTimeCV.setText(hmsTimeFormatter(millisUntilFinished));

                    progressBarCV.setProgress((int) (millisUntilFinished / 1000));


                }

                @Override
                public void onFinish() {

                    textViewTimeCV.setText(hmsTimeFormatter(timeCountInMilliSeconds));
                    // call to initialize the progress bar values
                    setProgressBarValues();
                    // changing the timer status to stopped
                    timerStatus = TimerStatus.STOPPED;
                }

            }.start();
        }
    }, 1000);


}

private void stopCountDownTimer() {
    countDownTimer.cancel();
}

private void setProgressBarValues() {

    progressBarCV.setMax((int) timeCountInMilliSeconds / 1000);
    progressBarCV.setProgress((int) timeCountInMilliSeconds / 1000);
}

private String hmsTimeFormatter(long milliSeconds) {

    String hms = String.format("%02d:%02d:%02d",
            TimeUnit.MILLISECONDS.toHours(milliSeconds),
            TimeUnit.MILLISECONDS.toMinutes(milliSeconds) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(milliSeconds)),
            TimeUnit.MILLISECONDS.toSeconds(milliSeconds) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(milliSeconds)));

    return hms;
    }
}

模型类

public class Task {
private String title;
private String time;

public Task() {
}

public Task(String title, String description, String time) {
    this.title = title;
    this.time = time;
}

public String getTitle() {
    return title;
}

public void setTitle(String name) {
    this.title = name;
}

public String getTime() {
    return time;
}

public void setTime(String time) {
    this.time = time;
}
}

适配器类

public class TaskAdapter extends RecyclerView.Adapter<MyViewHolder> {

private List<Task> taskList;

public TaskAdapter(List<Task> taskList) {
    this.taskList = taskList;
}



@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.cardview_layout, parent, false);

    return new MyViewHolder(itemView);
}

@Override
public void onBindViewHolder(MyViewHolder holder, int position) {

    Task task = taskList.get(position);
    holder.title.setText(task.getTitle());
    holder.textViewTimeCV.setText(task.getTime());
    holder.startStop(task.getTime());
}


@Override
public int getItemCount() {
    return taskList.size();
}

}

最后是我的活动课

public class MainActivity extends AppCompatActivity {

Task task;

private FloatingNavigationView mFloatingNavigationView;

public List<Task> taskList = new ArrayList<>();
private RecyclerView recyclerView;
public  TaskAdapter tAdapter;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            /*startActivity(new Intent(MainActivity.this, SecondActivity.class));*/
// just some data to make a timer
            prepareTaskData("jakldsj","asasd" ,  String.valueOf(1));
        }
    });

    recyclerView = (RecyclerView) findViewById(R.id.recycler_view);

    tAdapter = new TaskAdapter(taskList);
    RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
    recyclerView.setLayoutManager(mLayoutManager);
    recyclerView.setAdapter(tAdapter);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}
private void prepareTaskData(String title, String description, String time) {

method to set the values into the list
    task = new Task(title, description, time);
    taskList.add(task);
    tAdapter.notifyDataSetChanged();
}

}

1 个答案:

答案 0 :(得分:0)

我花了几天时间终于找到了解决方案。错误在于活动中的notifyDataChanged()方法。 Recyclerview,使用这种方法重复使用卡片,这就是为什么定时器停止的原因(当卡片正在回收,所有进程都停止时,并且在Holder类的startStop()方法中我们只是在“else”情况下)。在prepareTaskData()中,只需更改tAdapter.notifyItemChanged(taskList.size()-1);

上的最后一个字符串即可

希望,这对某人有用