Я знаю, сделал ли это правильно. У меня есть RecyclerView с 2 ViewHolders. ProgramHolder и CountDownTimerHolder. В CountDownTimerHolder это время начала обратного отсчета. Если вы нажмете кнопку «Настройки», я начну новую операцию, в которой я установлю минуты и секунды для таймера.
Мой вопрос: могу ли я передать данные, полученные из Activity, чтобы изменить заранее определенное время запуска в CountDownTimerHolder?
Извините, но я все еще новичок в программировании. Если есть какие-либо вопросы, дайте мне знать.
CountDownTimerHolder
public class CountdownTimerHolder extends RecyclerView.ViewHolder {
private static final String TAG = "CountdownTimerHolder";
Context context;
private TextView mTextViewCountdown;
private Button btnStartPauseTimer, btnStopTimer, btnSetTimerSettings;
private CountDownTimer countDownTimer;
private boolean timerRunning;
//THIS ARE THE VARIABLES TO BE UPDATED
public long START_TIME_IN_MILLI_SEC = 1000000;
private long timeLeftInMilliSec = START_TIME_IN_MILLI_SEC;
public CountdownTimerHolder(@NonNull View itemView) {
super(itemView);
Log.d(TAG, "CountdownTimerHolder: IT IS CALLED");
context = itemView.getContext();
mTextViewCountdown = itemView.findViewById(R.id.timer);
btnStartPauseTimer = itemView.findViewById(R.id.playBtn);
btnStopTimer = itemView.findViewById(R.id.stopBtn);
btnSetTimerSettings = itemView.findViewById(R.id.btnSetTimerSettings);
btnStartPauseTimer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (timerRunning) {
pauseTimer();
}else {
startTimer();
}
}
});
btnStopTimer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
resetTimer();
}
});
btnSetTimerSettings.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(context, SettingCountdownTimer.class);
context.startActivity(intent);
}
});
updateCountDownText();
}
private void startTimer() {
countDownTimer = new CountDownTimer(timeLeftInMilliSec, 1000) {
@Override
public void onTick(long millisUntilFinished) {
timeLeftInMilliSec = millisUntilFinished;
updateCountDownText();
}
@Override
public void onFinish() {
timerRunning = false;
btnStartPauseTimer.setBackgroundResource(R.drawable.ic_play_arrow_black_24dp);
}
}.start();
timerRunning = true;
btnStartPauseTimer.setBackgroundResource(R.drawable.ic_pause_black_24dp);
}
private void pauseTimer() {
countDownTimer.cancel();
timerRunning = false;
btnStartPauseTimer.setBackgroundResource(R.drawable.ic_play_arrow_black_24dp);
}
private void resetTimer() {
countDownTimer.cancel();
timeLeftInMilliSec = START_TIME_IN_MILLI_SEC;
updateCountDownText();
btnStartPauseTimer.setBackgroundResource(R.drawable.ic_play_arrow_black_24dp);
}
private void updateCountDownText() {
int minutes = (int) (timeLeftInMilliSec / 1000) /60;
int seconds = (int) (timeLeftInMilliSec /1000) % 60;
String timeLeftFormatted = String.format(Locale.getDefault(), "%02d:%02d", minutes, seconds);
mTextViewCountdown.setText(timeLeftFormatted);
}
}
SettingCountdownTimerActivity
public class SettingCountdownTimer extends AppCompatActivity {
EditText editTextMinutes, editTextSeconds;
Button btnSetTimer;
public long minutesToMillisInput;
public long secondsToMillisInput;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.countdown_timer_settings);
editTextMinutes = findViewById(R.id.editTextMinutes);
editTextSeconds = findViewById(R.id.editTextSeconds);
btnSetTimer = findViewById(R.id.btnSetTimer);
btnSetTimer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String inputMinutes = editTextMinutes.getText().toString();
String inputSeconds = editTextSeconds.getText().toString();
if (inputMinutes.length() == 0 && inputSeconds.length() == 0) {
Toast.makeText(SettingCountdownTimer.this, "Minuten und Sekunden koennen nicht leer sein",
Toast.LENGTH_SHORT).show();
return;
}
minutesToMillisInput = Long.parseLong(inputMinutes) * 60000;
secondsToMillisInput = Long.parseLong(inputSeconds) * 1000;
if (minutesToMillisInput == 0 && secondsToMillisInput == 0) {
Toast.makeText(SettingCountdownTimer.this, "Minuten und Sekunden koennen nicht 0 sein",
Toast.LENGTH_SHORT).show();
return;
}
//HERE I WANT TO PASS THE NEW VARIABLES TO VIEWHOLDER
finish();
}
});
}
}
Адаптер
public class PickedExercisesAdapter extends RecyclerView.Adapter {
OnItemClickListener mlistener;
private static final String TAG = "PickedExercisesRecycler started";
private ArrayList<ExerciseModel> mlist;
private static int EXERCISE_CARD_TYPE = 0;
private static int COUNTDOWN_TIMER_TYPE = 1;
public PickedExercisesAdapter(ArrayList<ExerciseModel> list) {
this.mlist = list;
}
@Override
public int getItemViewType(int position) {
if (position % 2 == 0) {
return EXERCISE_CARD_TYPE;
}
return COUNTDOWN_TIMER_TYPE;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
View view;
if (viewType == EXERCISE_CARD_TYPE) {
view = layoutInflater.inflate(R.layout.exercise_card_view, parent, false);
return new ProgramHolder(view);
} else {
view = layoutInflater.inflate(R.layout.countdown_timer, parent, false);
return new CountdownTimerHolder(view);
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
ExerciseModel exerciseModel = null;
if (position % 2 == EXERCISE_CARD_TYPE) {
if (position == 0) {
exerciseModel = mlist.get(0);
} else {
int listposition = position / 2;
exerciseModel = mlist.get(listposition);
}
ProgramHolder programHolder = (ProgramHolder) holder;
Glide.with(programHolder.itemView.getContext())
.load(exerciseModel.getExerciseImage())
.placeholder(R.drawable.ic_launcher_foreground)
.into(programHolder.exerciseImage);
programHolder.exerciseTitle.setText(exerciseModel.getExerciseTitle());
programHolder.exerciseTitle.setText(exerciseModel.getExerciseTitle());
programHolder.exerciseBodyPart.setText(exerciseModel.getExerciseBodyPart());
programHolder.exerciseDifficulty.setText(String.valueOf(exerciseModel.getDifficulty()));
programHolder.exerciseDescription.setText(exerciseModel.getExerciseDescription());
} else {
CountdownTimerHolder countDownTimerHolder = (CountdownTimerHolder) holder;
}
}
@Override
public int getItemCount() {
int listsizedouble = mlist.size() * 2;
return listsizedouble;
}
class ProgramHolder extends RecyclerView.ViewHolder {
OnItemClickListener mlistener;
TextView exerciseTitle, exerciseDifficulty, exerciseBodyPart, exerciseDescription;
ConstraintLayout expandableLayout;
Button arrowBtn;
ImageView exerciseImage;
CardView cardView;
public ProgramHolder(final View itemView) {
super(itemView);
arrowBtn = itemView.findViewById(R.id.arrowBtn);
expandableLayout = itemView.findViewById(R.id.constraintExpendable);
exerciseTitle = itemView.findViewById(R.id.exerciseTitle);
exerciseDifficulty = itemView.findViewById(R.id.exerciseDifficulty);
exerciseBodyPart = itemView.findViewById(R.id.exerciseBodyPart);
exerciseImage = itemView.findViewById(R.id.exerciseImage);
exerciseDescription = itemView.findViewById(R.id.exerciseDescription);
cardView = itemView.findViewById(R.id.cardView);
arrowBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = getAdapterPosition();
if (position != RecyclerView.NO_POSITION && mlistener != null) {
mlistener.onItemClick(position);
}
}
});
}
private void setExerciseDetails(ExerciseModel exerciseModel) {
exerciseTitle.setText(exerciseModel.getExerciseTitle());
}
}
public interface OnItemClickListener {
void onItemClick(int position);
}
public void setOnItemClickListener(OnItemClickListener listener) {
this.mlistener = listener;
}
}
RecyclerViewFragment
public class PickedExerciseRecyclerViewFragment extends Fragment {
private static final String TAG = "PickedExerciseRecyclerV";
RecyclerView recyclerView;
PickedExercisesAdapter adapter;
RecyclerView.LayoutManager manager;
View view;
private ArrayList<ExerciseModel> list;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
view = inflater.inflate(R.layout.picked_exercise_recycler_view, container, false);
list = getArguments().getParcelableArrayList("exerciseProgram");
recyclerView = view.findViewById(R.id.pickedExerciseRecyclerView);
manager = new LinearLayoutManager(getContext());
adapter = new PickedExercisesAdapter(list);
recyclerView.setLayoutManager(manager);
recyclerView.setHasFixedSize(true);
recyclerView.setAdapter(adapter);
adapter.setOnItemClickListener(new PickedExercisesAdapter.OnItemClickListener() {
@Override
public void onItemClick(int position) {
Log.d(TAG, "onItemClick: clicked " + position);
View view1 = recyclerView.getLayoutManager().findViewByPosition(position);
ConstraintLayout constraintLayout = view1.findViewById(R.id.constraintExpendable);
Button arrowBtn = view1.findViewById(R.id.arrowBtn);
CardView cardView = view1.findViewById(R.id.cardView);
if (constraintLayout.getVisibility() == View.GONE) {
cardView.getMaxCardElevation();
TransitionManager.beginDelayedTransition(cardView, new AutoTransition());
constraintLayout.setVisibility(View.VISIBLE);
arrowBtn.setBackgroundResource(R.drawable.ic_keyboard_arrow_up_black_24dp);
} else {
TransitionManager.beginDelayedTransition(cardView, new AutoTransition());
constraintLayout.setVisibility(View.GONE);
arrowBtn.setBackgroundResource(R.drawable.ic_keyboard_arrow_down_black_24dp);
}
}
});
return view;
}
}