Элементы RecyclerView имеют значок, который имеет условную привязку данных для видимости, но не обновляет - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть просмотрщик, который содержит список предопределенных элементов макета пользовательского интерфейса.В предопределенном макете пользовательского интерфейса есть значок, который виден, если элемент является типом проекта.Если это не тот тип, это не видно.Когда пользователь входит в режим выбора, я установил пользовательскую переменную в адаптере, чтобы скрыть этот значок на всех элементах, однако он не работает.

Я пытался использовать обратный вызов DiffUtil для обновления содержимого (т. Е. Возвращая falseдля contentsIsSame, когда он имеет видимый значок при изменении состояния), и я вижу, что он мерцает, но только для одной строки, и он возвращается.

Я пытался использовать notifydatasetchanged, также invalidateAll, ни одна из них не работает.

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

В предопределенном XML-макете пользовательского интерфейса для каждой строки:

        <variable
            name="isSelecting"
            type="boolean"/>

Затем в привязке видимости (пропущены другие атрибуты):

        <ImageView
            app:visibleGone="@{project.isIconVisible &amp;&amp; !isSelecting}"/>

В коде класса RecyclerView.Adapter, который создает список:

listItemBinding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.item_project_list, parent, false);

Когда кнопка выборанажата, это называется:

    public void setIsSelecting(boolean isSelecting){
        listItemBinding.setIsSelecting(isSelecting);

Здесь я попробовал различные методы, такие как listItemBinding.invalidateAll ().

Если я вручную установил isSelectiНапример, true или false, до того, как список заполнен, он правильно показывает / скрывает значки.Он просто не обновляется при изменении.

1 Ответ

0 голосов
/ 09 апреля 2019

После копания я понял, что listItemBinding - это отдельный элемент, а не весь список. Затем я нашел это: RecyclerView - получить все существующие представления / держатели просмотра

Я понял, что искал неправильное место для установки значения isSelected, и оно должно было войти в onBindViewHolder, а затем просто вызвать notifyDataSetChanged (), и оно обработает остальное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...