首页 > 解决方案 > 如何干扰 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));
    }

在此处输入图像描述

注意:对不起,Imgur 在土耳其被封锁,我也无法使用 VPN,所以我不得不从我的电脑上传。

提前致谢。

标签: androidandroid-layoutandroid-recyclerview

解决方案


我查看了您的代码,发现您将视图存储在一个中SparseArray,然后您尝试在按钮事件上对其进行更新。那是行不通的,它会给您带来问题,您说所有可见视图都会受到影响并且不可见的项目不会受到影响,因为这些隐形物品实际上是被回收的,或者您可以说它们不再存在,因此对这些物品的任何更改都不起作用。

最正确的方法是在模型中存储值并在视图变得可见时从中更新视图。

我没有很多你的课程,比如等CategoriesBaseViewHolder但我仍然试图在下面举一个例子来适应你的情况:

让我们考虑一下我有一个模型,如果选择了类别并且未选择类别Categories,我想显示一个,所以我要做的是:ic_doneic_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);
        }

    }

我希望它确实涵盖了您的情况,如果没有,请在评论中告诉我。


推荐阅读