android - 如何干扰 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,所以我不得不从我的电脑上传。
提前致谢。
解决方案
我查看了您的代码,发现您将视图存储在一个中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);
}
}
我希望它确实涵盖了您的情况,如果没有,请在评论中告诉我。
推荐阅读
- python - 无法从 sys 库中导入 sys 类
- c++ - 数组操作;Fortran 等价于 (:)
- python - 使用至少 n 个空格分割字符串
- android - TabLayout 图标未显示
- python-2.7 - 在 mplot3d 中绘制与曲面相交的 3d 线(matplotlib python)
- r - 我的代码返回单个值而不是向量
- angular - 生产构建 ng build --prod 时出现错误
- c# - 如何修复 Visual Studio 2019 中的错误 CS0246
- python - 如何通过请求下载文件而不是 HTML
- c# - 在构建游戏上托管比赛时,Unity UNET 网络服务器未激活