在RecyclerView和方法中使用CountDownTimers

时间:2017-08-01 14:30:34

标签: android android-recyclerview recycler-adapter onresume onpause

我在回收站视图中有一个关于多个计时器的问题。我现在已经有了功能性的rv,但我仍然坚持onStop,onPause,onResume方法。我希望我的应用程序在关闭时继续倒计时。请帮我找到解决方案,我对android有点新鲜。

我的代码:

持有人类

public class MyViewHolder extends RecyclerView.ViewHolder {

private long timeCountInMilliSeconds = 1 * 60000;

public long timeLeft = 0;

private enum TimerStatus {
    STARTED,
    STOPPED
}

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

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() {
    countDownTimer = new CountDownTimer(timeCountInMilliSeconds, 1000) {
        @Override
        public void onTick(long millisUntilFinished) {

            textViewTimeCV.setText(hmsTimeFormatter(millisUntilFinished));

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

            timeLeft = millisUntilFinished;

            Log.d("timeLeft", String.valueOf(timeLeft));

        }

        @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();
}

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);
    MyViewHolder holder = new MyViewHolder(itemView);
    return holder;
}

@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 {


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


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

    initializeDrawer();

    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));
        }
    });

    recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
    recyclerView.setDrawingCacheEnabled(true);
    recyclerView.setItemViewCacheSize(50);

    tAdapter = new TaskAdapter(taskList);
    RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
    recyclerView.setLayoutManager(mLayoutManager);
    recyclerView.addOnItemTouchListener(new RecyclerViewTouchListener());
    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);
}

@Override
protected void onResume() {
    super.onResume();
    tAdapter.notifyItemChanged(taskList.size()-1);
}

private void initializeDrawer()
{

    AccountHeader headerResult = initializeHeader();

    PrimaryDrawerItem item1 = new PrimaryDrawerItem().withIdentifier(1).withName(R.string.app_name);
    SecondaryDrawerItem item2 = new SecondaryDrawerItem().withIdentifier(2).withName(R.string.slogan_main);
    //create the drawer and remember the `Drawer` result object
    Drawer result = new DrawerBuilder()
            .withActivity(this)
            .withAccountHeader(headerResult)
            //.withToolbar(toolbar)
            .addDrawerItems(
                    item1,
                    new DividerDrawerItem(),
                    item2,
                    new SecondaryDrawerItem().withName(R.string.material_drawer_close)
            )
            .withOnDrawerItemClickListener(new Drawer.OnDrawerItemClickListener() {
                @Override
                public boolean onItemClick(View view, int position, IDrawerItem drawerItem) {
                    // do something with the clicked item :D





                    return true;
                }
            })
            .build();
}
private AccountHeader initializeHeader()
{

    AccountHeader headerResult = new AccountHeaderBuilder()
            .withActivity(this)
            .withHeaderBackground(R.drawable.drawable_circle_dark_blue)
            .addProfiles(
                    new ProfileDrawerItem().withName("Mike Penz").withEmail("mikepenz@gmail.com").withIcon(getResources().getDrawable(R.drawable.drawable_circle_dark_blue))
            )
            .withOnAccountHeaderListener(new AccountHeader.OnAccountHeaderListener() {
                @Override
                public boolean onProfileChanged(View view, IProfile profile, boolean currentProfile) {
                    return false;
                }
            })
            .build();

    return headerResult;}

第二个活动(这里我将值设置到我的列表中,它连接到我的adadpter)

public class SecondActivity extends AppCompatActivity implements View.OnClickListener {

Task task;


private EditText editTextMinute;
private ImageView imageViewStartStop;
private EditText editTextTitle;

private String title;
private String minutes;


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

    // method call to initialize the views
    initViews();
    // method call to initialize the listeners
    initListeners();

}

/**
 * method to initialize the views
 */
private void initViews() {
    editTextMinute = (EditText) findViewById(R.id.editTextMinute);
    imageViewStartStop = (ImageView) findViewById(R.id.imageViewStartStop);
    editTextTitle = (EditText) findViewById(R.id.editTextTitle);
}

/**
 * method to initialize the click listeners
 */
private void initListeners() {
    imageViewStartStop.setOnClickListener(this);
}

/**
 * implemented method to listen clicks
 *
 * @param view
 */
@Override
public void onClick(View view) {
    switch (view.getId()) {
        case R.id.imageViewStartStop:
            prepareTaskData(title, null, minutes);

            break;
    }
}


private void prepareTaskData(String title, String description, String time) {

    time = editTextMinute.getText().toString().trim();
    // fetching minutes for Task obj
    minutes = editTextMinute.getText().toString();
    // fetching value from edit text and type cast to string
    title = editTextTitle.getText().toString();
    // toast message to fill edit text
    if(minutes.isEmpty() || minutes == null || minutes == String.valueOf(0) ||  title.isEmpty() )
    {
        Toast.makeText(getApplicationContext(), getString(R.string.message_minutes_or_title), Toast.LENGTH_LONG).show();
    }
    else
    {
        task = new Task(title, description, time);
        taskList.add(task);
        tAdapter.notifyItemChanged(taskList.size() - 1);
        finish();
    }
}}

也许我应该在我的项目中实现Service类?任何信息泄露都对我非常有用

1 个答案:

答案 0 :(得分:0)

您需要在RecyclerView的onCreateViewHolder方法中添加倒计时器,因为onCreateViewHolder只会被调用一次。

每次用户向上或向下滚动时都会调用

onBindViewHolder

参考this