2015-06-27 94 views
1

我有一個RecylerView適配器,我正在處理onCreateViewHolder方法中的onClicks,但我無法弄清楚獲取當前位置的方法。我現在的方法是這樣的:如何從onCreateViewHolder獲取位置

@Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View itemView = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.card_small, parent, false); 

     return new ViewHolder(itemView, new ViewHolder.IViewHolderClicks() { 
      @Override 
      public void onImage(ImageView image) { 
       // Need the position for logic in here 
       // for example, myArrayList.get(position); 
      } 
     }); 
    } 

有誰知道如何從訪問中onCreateViewHolder的當前位置?

+0

如果我將該位置存儲在類成員變量中,並將其分配給onBindViewHolder方法,那麼這是一種可靠的方法嗎? – nabir

回答

2

在您的onClick處理程序中,調用viewHolder.getAdapterPosition()。

@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View itemView = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.card_small, parent, false); 

    final ViewHolder vh = ViewHolder(itemView, new ViewHolder.IViewHolderClicks() { 
     @Override 
     public void onImage(ImageView image) { 
      int position = vh.getAdapterPosition(); 
     } 
    }); 
    return vh; 
} 
+0

我已經嘗試過,但我總是得到ViewHolder可能尚未初始化的錯誤。 – nabir

+0

你可以製作IViewHolderClicks()而不是構造函數參數嗎? – yigit

+0

對不起,我忘了更新!但我做了一個二傳手,它工作得很好! – nabir

1

onCreateViewHolder()是不適合存儲位置的地方。當ViewHolder被回收時,您將不會再接到onCreateViewHolder()的電話,所以在回收ViewHolder時,您將沒有機會「修復」該位置。

您可以改爲在onBindViewHolder()中執行此操作,該操作會將您的位置作爲其參數之一,並在每次回收ViewHolder時調用該位置。

+0

這就是我所傾向的,我會試試看看它是否有效!乾杯! – nabir

+2

不要在onBindViewHolder中添加監聽器,因爲該位置可能會更改而不重新綁定視圖。 – yigit