我有一个包含 20 个项目的 recyclerview。 recyclerview 保存图像的缩略图。单击某个项目时,该图像在 viewpager 中可见。
当一次滑动 viewpager 时,我得到当前项目在 viewpager 中的位置,然后我在 recyclerview 中得到该位置的 View 并更改它的背景 也就是说,将带有缩略图的 View 设置为选中强>
viewPager.addOnPageChangeListener(this);
@Override
public void onPageSelected(int position) {
recylerViewAdapter.changesBackground(position);
}
recyclerview 适配器 changeBackgroundItem()
public void changesBackground(int position) {
View v = recyclerView.getChildAt(position);
if(v != null){
v.setSelected(true);
}
}
recyclerview 行/项目背景资源
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Color when the row is selected -->
<item android:state_selected="true">
<shape>
<solid android:color="@android:color/transparent"/>
<stroke android:color="@color/md_red_A700" android:width="3dp"/>
<corners android:radius="1dp"/>
<padding android:bottom="4dp" android:left="4dp" android:right="4dp" android:top="4dp"/>
</shape>
</item>
<item android:state_selected="false">
<shape>
<solid android:color="@android:color/transparent"/>
<stroke android:color="@color/md_black_1000" android:width="2dp"/>
<corners android:radius="1dp"/>
<padding android:bottom="4dp" android:left="4dp" android:right="4dp" android:top="4dp"/>
</shape>
</item>
</selector>
问题是不是只选择了一项,而是选择了多项。例如,当我将位置 1 处的项目背景更改为红色时,位置 8,10 等处的项目也会被选中。
这是items View 回收造成的吗?
如何避免其他项目被选中?
最佳答案
终于解决了这个问题
基本上我的问题是,如果我在 recyclerView 中滚动离开当前选定的项目,由于 View 的回收,其他项目的 View 也会显示为已选中,因为我没有办法取消选中的项目时被卷走了。因此,当您滚动浏览 recyclerview 时,最终会选择多个项目。
我最终使用两个接口(interface)完成了这项工作。不需要丑陋的循环黑客。
ViewPager.OnPageChangeListener
和 OnChildAttachStateListener
。
public class MyActiviy extends AppCompatActivity implements
ViewPager.OnPageChangeListener,RecyclerView.OnChildAttachStateChangeListener{
int currentPosition = 0;
int previousPosition = 0;
ViewPager viewpager;
RecyclerView recylerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
viewpager = (ViewPager) findViewById(R.id.viewpager);
recylerView = (RecyclerView) findViewById(R.id.recyclerview);
viewpager.addOnPageChangeListener(this);
recylerView.addOnChildAttachStateChangeListener(this);
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
previousItemPos = currentItemPos;
currentItemPos = position;
clearSelectionBackground(previousItemPos);
setSelectionBackground(currentItemPos);
}
@Override
public void onPageScrollStateChanged(int state) {
}
@Override
public void onChildViewAttachedToWindow(View view) {
//we have overide this method so that selected item
//can remain selected when one scroll the recyclerview
int childPosition = recylerView.getChildAdapterPosition(view);
if (childPosition == currentItemPos) {
//set selection
view.setBackgroundColor(getResources()
.getColor(android.R.color.RED));
}
}
@Override
public void onChildViewDetachedFromWindow(View view) {
//remove selection
view.setBackgroundColor(getResources()
.getColor(android.R.color.transparent));
}
private void setSelectionBackground(int newItem) {
RecyclerView.ViewHolder holder = recylerView.findViewHolderForPosition(newItem);
holder.setBackgroundColor(getResources()
.getColor(android.R.color.RED));
}
private void clearSelectionBackground(int oldItem){
if(oldItem != currentItemPos){
RecyclerView.ViewHolder oldHolder = recylerView.findViewHolderForPosition(oldItem);
oldHolder.itemView.setBackgroundColor(getResources()
.getColor(android.R.color.transparent));
}
}
}
关于android - 在不影响其他项目 View 的情况下更改 recyclerview 项目 View 的背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39589033/