Как помешать невидимым элементам RecyclerView? - PullRequest
0 голосов
/ 04 декабря 2018

Я работаю над RecyclerView с большим количеством данных по горизонтали, как показано на изображении.Мне нужно разместить соответствующее изображение на каждой кнопке, однако будут затронуты только видимые элементы RecyclerView, а невидимые элементы - нет.

Мой RecyclerView

<android.support.v7.widget.RecyclerView
        android:id="@+id/rvCarPart"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        android:clipToPadding="true" />

Мой адаптер

LinearLayoutManager layoutManager = new LinearLayoutManager(dataBinding.rvCarPart.getContext(), LinearLayoutManager.HORIZONTAL, false);
        dataBinding.rvCarPart.setLayoutManager(layoutManager);

        dataBinding.rvCarPart.setHasFixedSize(true);

        mCategories = getIntent().getParcelableArrayListExtra(Constants.PARCELABLE_EXTRA_KEY);

        if (mCategories == null) return;

        mCurrentStatusAdapter.setData(mCategories);
        dataBinding.rvCarPart.setAdapter(mCurrentStatusAdapter);

Относительный код адаптера в действии - здесь я использую EventBus, и каждый фрагмент посылает сигнал в мое действие для обновления изображения.

@Subscribe
    @AllowConcurrentEvents
    public void onEvent(ButtonEvent buttonEvent) {
        if (buttonEvent.isNull()) {
            mCurrentStatusAdapter.changeVisibilityOfSelectorAt(buttonEvent.getColumnPosition(), R.drawable.ic_undone);
        } else {
            mCurrentStatusAdapter.changeVisibilityOfSelectorAt(buttonEvent.getColumnPosition(), R.drawable.ic_done);
        }
    }

Относительный метод внутри CurrentStatusAdapter

public void changeVisibilityOfSelectorAt(int position, @DrawableRes int drawable) {
        mImageViews.get(position).setVisibility(View.VISIBLE);
        mImageViews.get(position).setBackground(ContextCompat.getDrawable(mViews.get(position).getContext(), drawable));
    }

enter image description here

Примечание: ИзвинитеImgur заблокирован в Турции, и я тоже не смог сделать это с помощью VPN, поэтому мне пришлось загружать данные со своего компьютера.

Заранее спасибо.

1 Ответ

0 голосов
/ 05 декабря 2018

Я просмотрел ваш код и обнаружил, что вы сохраняете представления в SparseArray, а затем пытаетесь обновить его при событии кнопки. Ну, это не сработает, у вас возникнет проблема с тем, что вы сказали все видимые представления.будут затронуты и невидимые элементы не будут затронуты, потому что эти невидимые элементы фактически переработаны, или вы могли бы сказать, что они больше не существуют, поэтому любые изменения в них не сработают.

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

У меня не было многих ваших классов, таких как Categories, BaseViewHolder и т. д., но я все еще пытаюсь поставитьПример ниже, чтобы соответствовать вашему случаю:

Давайте рассмотрим, что у меня есть модель Categories, и я хочу показать ic_done, если категория выбрана, и ic_undone, если категория не выбрана, так чтоя бы сделал это:

В MyActivity классе:

public void onEvent(ButtonEvent buttonEvent) {
        if (buttonEvent.isNull()) {
            Categories categories = list.get(buttonEvent.getColumnPosition());
            categories.setSelected(false);
            adapter.notifyDatasetChanged();
        } else {
            Categories categories= list.get(buttonEvent.getColumnPosition());
            categories.setSelected(true);
            adapter.notifyDatasetChanged();
        }
    } 

В CurrentStatusAdapter классе.

@Override
    public void onBindViewHolder(@NonNull CurrentPartViewHolder holder, int position) 
{
        Categories categories = data.get(position);

        if (categories.isSelected()){
            holder.getImageView().setImageResource( R.drawable.ic_done);
        }else {
            holder.getImageView().setImageResource( R.drawable.ic_undone);
        }

    }

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

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