如何干扰RecyclerView的不可见项?

时间:2018-12-04 15:10:32

标签: android android-layout android-recyclerview

我正在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进行连接,因此必须从PC上传。

谢谢。

1 个答案:

答案 0 :(得分:0)

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

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

我没有很多课程,例如CategoriesBaseViewHolder等,但是我仍然想在下面举例说明您的情况:

让我们考虑一下,我有一个模型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);
        }

    }

我希望它能解决您的问题,如果没有,请在评论中让我知道。