【问题标题】:Change background of recyclerview item view without affecting other item's view更改 recyclerview 项目视图的背景而不影响其他项目的视图
【发布时间】:2016-09-20 08:21:12
【问题描述】:

我有一个包含 20 个项目的回收站视图。 recyclerview 保存图像的缩略图。当一个项目被点击时,图像会在 viewpager 中可见。

当滑动viewpager时,我会在viewpager中获取当前项目的位置,然后在recyclerview中获取该位置的视图并将其更改为背景即,将带有缩略图的视图设置为选中

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 e.tc 的项目也会被选中。

  • 这是由物品视图回收造成的吗?

  • 如何避免其他项目被选中?

【问题讨论】:

  • 如果您选择位置 1 的项目,其他随机项目也会改变背景颜色?
  • @Tony 我不会改变他们的背景。你是在建议我改变他们的背景吗?
  • @Tony 即使我这样做也无法正常工作
  • 尝试将onBindViewHolder 中的position 更改为viewHolder.getAdapterPosition(),以便在回收站视图中获得实际位置。
  • @harneev 我也试过了。但它产生了与上面相同的结果。

标签: android android-viewpager android-recyclerview


【解决方案1】:

我终于能够解决问题了

基本上我的问题是,如果我从 recyclerView 中的当前选定项目滚动,由于视图的回收,其他项目的视图也会显示为选中,因为我没有办法取消选择选定的项目时它被卷走了。因此,当您滚动浏览 recyclerview 时,最终会选择多个项目。

我最终使用两个接口完成了这项工作。不需要丑陋的循环黑客。

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));

    }
  }
   }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多