2015-07-21 141 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()' –

相關問題