Задайте вычитание дней из календаря

У меня в приложении есть горизонтальный календарь. Итак, я реализовал следующую библиотеку https://github.com/Mulham-Raee/Horizontal-Calendar Я также реализовал свою собственную кнопку назад и вперед.

При нажатии кнопки «назад» выполняется возврат на один день с текущей даты, а при нажатии кнопки «назад» - на один день вперед. Предположим, сегодня 10 августа, и я прокручиваю по горизонтали до 15 июля, не нажимая кнопки назад или вперед. Теперь, если я нажму кнопку «Назад» вместо 14 июля, я вернусь на 9 августа.

Ниже мой код

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <com.myapplication.HorizontalCalendarView
        android:id="@+id/calendarView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:selectedDateBackground="@drawable/selected_date"
        />

    <Button
        android:id="@+id/back"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        android:layout_marginStart="8dp"
        android:text="Back"
        app:layout_constraintBottom_toTopOf="@+id/calendarView"
        app:layout_constraintStart_toStartOf="parent" />

    <Button
        android:id="@+id/forward"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="16dp"
        android:text="Forward"
        app:layout_constraintBottom_toTopOf="@+id/calendarView"
        app:layout_constraintEnd_toEndOf="parent" />

</android.support.constraint.ConstraintLayout>

Код Котлина:

    class MainActivity : AppCompatActivity() {

private var counter: Int = 0

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main_2)

    val format1 = SimpleDateFormat("yyyy-MM-dd", Locale.US)
    val currentDate = format1.format(Calendar.getInstance().time)

    Toast.makeText(this,currentDate.toString(),Toast.LENGTH_LONG).show()

    val startDate = Calendar.getInstance()
    startDate.add(Calendar.MONTH, -10)


    val endDate = Calendar.getInstance()
    endDate.add(Calendar.MONTH, 30)

    val horizontalCalendar = HorizontalCalendar.Builder(this, R.id.calendarView)
            .range(startDate, endDate)
            .datesNumberOnScreen(7)
            .build()


    horizontalCalendar.setCalendarListener(object : HorizontalCalendarListener() {
        override fun onDateSelected(date: Calendar, position: Int) {
            val selectedDate = format1.format(date.time)

            Toast.makeText(this@MainActivity,
                    "Pritish"+SimpleDateFormat("MMMM yyyy", Locale.US).format(date.time),
                    Toast.LENGTH_SHORT).show()

            if(format1.parse(selectedDate).before(format1.parse(currentDate))){
                Toast.makeText(this@MainActivity,"Cannot selecte previous date",Toast.LENGTH_LONG).show()
            } else {
                Toast.makeText(this@MainActivity,
                        selectedDate
                        ,Toast.LENGTH_LONG).show()
            }
        }

        override fun onCalendarScroll(calendarView: HorizontalCalendarView,
                                      dx: Int, dy: Int) {


            Log.i("Pritish",dx.toString()+dy.toString())


            counter += if(dx<0){
                -1
            } else {
                1
            }

        }

        override fun onDateLongClicked(date: Calendar, position: Int): Boolean {
            return true
        }
    })

    val cal = Calendar.getInstance()

    back.setOnClickListener {

        cal.add(Calendar.DAY_OF_MONTH,counter-1)
        counter = 0
        horizontalCalendar.selectDate(cal,false)
        horizontalCalendar.refresh()

    }

    forward.setOnClickListener {
        cal.add(Calendar.DAY_OF_MONTH,counter+1)
        counter = 0
        horizontalCalendar.selectDate(cal,false)
        horizontalCalendar.refresh()
    }
}
}

календарь не распознает, что вы находитесь на 15 июля. Итак, создайте экземпляр и сохраните новое значение, а затем используйте это значение при использовании назад или вперед.

sanjeev 10.08.2018 16:09

@sanjeev, я сделал то, что вы сказали, но получаю недопустимые аргументы в cal.add (cal2.get (Calendar.DAY_OF_MONTH), - 1)

Pritish 10.08.2018 16:25

установите выбранную дату в место Calendar.DAY_OF_MONTH. Это cal.add (selecteddate, -1)

sanjeev 10.08.2018 16:34

Установлен ли счетчик на правильное значение? Что вам показывает журнал? Вы также можете зарегистрировать счетчик в прослушивателях кликов. onDateSelected срабатывает во время прокрутки или только при нажатии на дату?

Geoffrey Wiseman 13.08.2018 16:46

счетчик получает заклинание или указание несколько раз, даже если я проведу пальцем по одной дате

Pritish 13.08.2018 16:48
3
5
517
3

Ответы 3

Похоже, что возможно, что onDateSelected сработает во время прокрутки, и вы можете использовать это плюс простой + 1 / -1, но вам нужно попробовать это, чтобы увидеть, работает ли это - сложно проверить, просто глядя в коде библиотеки.

Я сделал то, что вы сказали, хотя ошибка исчезла, но поведение неправильное

Pritish 11.08.2018 07:11

Ну прогресс - второй параметр меняли? Что происходит сейчас вместо этого?

Geoffrey Wiseman 13.08.2018 16:39

Я обновил код в соответствии с ответом bernlim, но он все еще не работает.

Pritish 13.08.2018 16:44

@Geoffrey, для справки в будущем: если вы уверены, что вопрос был изменен настолько существенно, что аннулирует существующие ответы, вы можете вернуть его к предыдущему состоянию, если хотите. Мы очень стараемся не задавать здесь вопросы, которые тратят время попусту.

halfer 14.08.2018 00:05

Есть решение с предоставленным вами кодом. Попробуйте сохранить глобальный счетчик количества движений (-1 для обратного смахивания и +1 для прямого смахивания). Каждый раз, когда происходит событие смахивания, обновляйте этот счетчик.

Затем используйте этот счетчик в ваших передних и задних слушателях. Например, если вы пролистали 5 дней назад, COUNTER = -5. Затем, если пользователь нажимает кнопку "Назад",

cal.add(Calendar.DAY_OF_MONTH, (COUNTER-1))

Не забывайте сбрасывать счетчик на 0 каждый раз после нажатия кнопки.

Чтобы объединить это с onCalendarScroll, вы можете установить другую глобальную переменную, которая отслеживает общее изменение dx. Когда dx достигает определенного значения, вы знаете, что было выполнено полное смахивание, поэтому счетчик +/- 1. Вот пример кода для иллюстрации:

private var dx_tracker: Int = 0
private var counter: Int = 0
private SWIPE_VAL = <your tested value>

override fun onCalendarScroll(calendarView: HorizontalCalendarView,
                                  dx: Int, dy: Int) {
    Log.i("Pritish", dx.toString() + dy.toString())
    dx_tracker += dx

    if(dx_tracker >= SWIPE_VAL) {
        counter += 1;
        dx_tracker = 0;
    }
    else if(dx_tracker <= -SWIPE_VAL) {
        counter -= 1;
        dx_tracker = 0;
    }
}

Ах, вы используете библиотеку от кого-то другого. Вы пробовали использовать прослушиватель onCalendarScroll, упомянутый в README этой библиотеки?

bunbun 13.08.2018 09:14

да, я использую это, но не знаю, как узнать направление. Я проверяю значения dx и dy, прокручиваю только один раз, увеличиваю или уменьшаю значение счетчика много раз

Pritish 13.08.2018 09:17

что, если пользователь прокручивает быстро, тогда счетчик тоже будет уменьшаться один раз, а не на количество прокрученных пользователем дат

Pritish 13.08.2018 10:05

Возможно, когда dx изменится на определенную величину, это будет считаться "одним движением" или "уменьшением даты на один". Это то, что вам нужно будет проверить. Но я думаю, что после некоторой доработки эта идея сработает.

bunbun 13.08.2018 10:16

не могли бы вы обновить исходное сообщение новым кодом?

bunbun 13.08.2018 10:50

Позвольте нам продолжить обсуждение в чате.

bunbun 14.08.2018 05:26

Вам нужно установить дату в экземпляре кал.

Я не нашел синтаксиса, устанавливающего экземпляр кал.

вы определили экземпляр cal следующим образом

val cal = Calendar.getInstance() 

Ваш счетчик не увеличивается. Итак, это перенесет вас на предыдущую дату. кал всегда сохраняет 10 августа, если вы не нажимали ни одной кнопки.

Вы можете сбросить кал instance onDateSelected method

Другие вопросы по теме