android - 在不影响其他项目 View 的情况下更改 recyclerview 项目 View 的背景

标签 android android-viewpager android-recyclerview

我有一个包含 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.OnPageChangeListenerOnChildAttachStateListener

 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/

相关文章:

android - 如何使用Kotlin Gradle DSL在Android项目中启用ViewBing?

android - ViewPager getChildCount 返回零

android - 在 ViewPager 中输入动画

android - 如何使 ViewPager 的项目在方向改变时被销毁?

android - Observable android 理解

java - Android kotlin - RecyclerView 应用程序在按特定顺序删除项目后崩溃

java - Android Margin 和 Padding 不适用于 ScrollViews 内的 RecyclerViews

java - 设置足球的持续时间(足球)

android - 使用 rxjava2 时出现 Retrofit2 Unauthenticated 401 错误

android - android布局中按钮的通用监听器?