2015-07-21 49 views
3

我正在使用gridLayoutManager显示我的RecyclerView项目。我还实施了项目为什么RecyclerView项目会随机移动GridLayoutManager中的位置?

public void onItemClicked(int position) { 
    final SquareImageView clickedItem = (SquareImageView)(lLayout.findViewByPosition(position)); 

    if (actionMode != null) { 
     if(clickedItem.getPaddingLeft() == 1) clickedItem.setPadding(7,7,7,7); 
     else clickedItem.setPadding(1,1,1,1); 

    } else { 
     thumbView = (SquareImageView)(lLayout.findViewByPosition(position)); 
     if (Build.VERSION.SDK_INT > Build.VERSION_CODES.ICE_CREAM_SANDWICH) 
      zoomImageFromThumb(position); 
     else 
     imageFromThumb(position); 
    } 
} 

@Override 
public boolean onItemLongClicked(int position) { 
    final SquareImageView clickedItem = (SquareImageView)(lLayout.findViewByPosition(position)); 
    clickedItem.setPadding(7,7,7,7); 
    if (actionMode == null) { 
     actionMode = startSupportActionMode(new ActionModeCallback()); 
     actionMode.getMenu().findItem(R.id.menu_remove).setIcon(new IconDrawable(this, Iconify.IconValue.fa_trash).colorRes(R.color.accent_color).actionBarSize()); 
    } 
    return true; 
} 

的onClick和onLongClick正如你可以看到我只是改变被点击项目的填充在longClick并在点击如果actionMode不为空。

一切工作按预期:如果我渴望单击第一个项目的填充做改变,但是当我滚动到网格的底部填充都转移到了底部的图像或其他一些随机图像。再次,如果我滚动到顶部,顶部项目将没有填充和填充已转移到一些其他随机元素。

这是问题,因为元素的回收?我如何摆脱这一点?

+0

HII朋友我也在寻找recyclerview单和multiitems选择时对上下文动作模式项目长按删除和共享,如Gmail样品,请帮助我不要忽略 – Harsha

回答

3

是。这个问题是由于回收视图,并且是预期的行为。

很容易理解这一点。滚动回收站视图时,只有一组有限的视图保存在内存中。但正如你所看到的,填充仅在点击之后应用一次。那么,视图回收后会发生什么?系统如何记得再次添加填充?

因此,系统通过调用RecyclerViewAdapter的onBindViewHolder()再次重新绘制视图项目,并使用视图保持器可能已经是其他某些回收项目。你需要确保每次onBindViewHolder()时间是叫你做两件事情 -

1)设置填充,如果该项目被选中(这可以确保你的选择的项目总是得到填充),以及

2)设置填充到如果没有选择项(这保证了随机物品没有得到填充。再次,这是意料之中的,因为所选项目的ViewHolder可于未选定项目中重复使用!))

您可以使用SparseBooleanArray来存储选择定位并在onBindViewHolder中检查其值。请记住,您还需要在点击后调用notifyItemChanged(i),以便重绘该项目(再次调用onBindViewHolder())。

粗略地说,你可以添加两件事情你的适配器代码:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder>{ 
    //... 
    private SparseBooleanArray selectedItems = new SparseBooleanArray(); 

    // Call this from your onItemLongClicked() 
    public void selectItem(int position){ 
     selectedItems.put(position, true); 
     notifyItemChanged(position); 
    } 

    // Call this in your onItemClicked() to check if position is selected 
    public boolean isItemSelected(int position){ 
     return selectedItems.get(position, false); 
    } 

    @Override 
    public void onBindViewHolder(final ViewHolder holder, final int position) { 
     // your existing code 
     if(selectedItems.get(position, false)){ 
     holder.itemView.setPadding(7,7,7,7); 
     } 
     else { 
      holder.itemView.setPadding(1,1,1,1); 
     } 
    } 
} 
+0

谢谢安妮兄弟。您的答案已经非常清楚地解释,并在按预期实施其工作之后。 – rockfight

+0

HII正在使用adapter.how我可以实现对上下文动作模式删除项长按和共享请帮我brother.am与recyclerview和API调用和数据设置为view.am看起来像做也lokking为recyclerview与列表数据集Gmail的样品请不要hessitae或无视我的proble请helpme – Harsha

+0

@Harsha添加'holder.itemView.setOnClickListener(...)'和'holder.itemView.setOnLongClickListener(...)''里面onBindViewHolder()' –

相关问题