我正在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进行连接,因此必须从PC上传。
谢谢。
答案 0 :(得分:0)
我查看了您的代码,发现您将视图存储在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);
}
}
我希望它能解决您的问题,如果没有,请在评论中让我知道。