Я пытаюсь создать действие с 4 Chips в горизонтальной прокрутке ChipGroup.

Это действие использует ChipGroup в качестве фильтра для вызова API и может иметь дополнительные элементы, указывающие, какой чип был выбран пользователем.

Сейчас делаю так:

chipScroll.postDelayed(() -> {
                chipScroll.smoothScrollBy(800, 0);
            },100);

Но это довольно хакерское решение того, чего я хочу достичь.

Есть ли другой способ прокрутки до выбранного Chip в горизонтальной прокрутке ChipGroup?

Редактировать :

Я пытался итеративно получить все фишки в ChipGroup и сопоставить их идентификаторы. Но, похоже, и хакерский. Что-то вроде spinnerAdapter.getItem(spinner.getSelectedItemPosition) - это то, к чему я стремлюсь

2
Kevin Murvie 12 Дек 2019 в 10:07

3 ответа

Я нашел ответ здесь.

Я забыл, что ChipGroup - это просто ViewGroup, а HorizontalScrollView - просто дополнительная функция для прокрутки.

Я мог бы просто сделать что-нибудь вроде:

chipGroup.post(() -> {
    Chip chipByTag = chipGroup.findViewWithTag(filterModel.getComplaint_status());
    chipGroup.check(chipByTag.getId());
    chipScroll.smoothScrollTo(chipByTag.getLeft() - chipByTag.getPaddingLeft(), chipByTag.getTop());
});

Выполнение этого в onCreate может привести к сбою, поскольку Tag еще не назначен, и я использую DataBinding для тега в XML (CMIIW), следовательно, мы должны сделать это в .post() работоспособный.

4
Kevin Murvie 12 Дек 2019 в 10:31

Для Котлина: использование ответа @Kevin Murvie

binding.layoutChipChoiceProducts.chipGroupDrinksChoice.post {
        val chip =
            binding.layoutChipChoiceProducts.chipGroupDrinksChoice.findViewWithTag<Chip>(tag)
        binding.layoutChipChoiceProducts.scrollLayoutChip.scrollTo(
            chip.left - chip.paddingLeft, chip.top
        )
    }
1
Jeremiah Polo 28 Июл 2020 в 13:59

Вы должны обернуть свою ChipGroup с помощью HorizontalScrollView и просто вызвать эту функцию расширения после выбора чипа:

inline fun <reified T : View> HorizontalScrollView.scrollToPosition(
    tag: String?,
) {
    val view = findViewWithTag<T>(tag) ?: return
    val leftEdgePx = view.left
    val screenCenterPx = Resources.getSystem().displayMetrics.widthPixels / 2
    val scrollPx = if (leftEdgePx < screenCenterPx) 0
    else leftEdgePx - screenCenterPx + view.width / 2
    this.post {
        this.smoothScrollTo(scrollPx, view.top)
    }
}

Это всегда будет отображать выбранную фишку по центру экрана (если это возможно).

0
mrkidjordje 15 Фев 2021 в 02:11