1)問題的onClick內ViewHolder沒有獲得點擊的項目適配器
我想設置一個CardView內的2個按鈕2個監聽器。我需要知道哪個項目已被選中。我用CardView與RecyclerView和FirebaseRecyclerAdapter我FirebaseRecyclerAdapter的(RecyclerView.Adapter)
2)老樣子
我在populateViewHolder創建的監聽器()這樣的:
@Override
protected void populateViewHolder(final ItemViewHolder viewHolder, final Item model, final int position) {
viewHolder.firstButton.setOnClickListener(new View.OnClickListener() {
Item selectedItem = getItem(position);
//do something for the item selected
}
}
這工作正常!
3)我想這樣做
集聽衆在ViewHolder類(在自己的文件中定義),並做一些對所選項目
我想設置ViewHolder類中的監聽器,因爲相同的ViewHolder用於不同的適配器,我認爲這是一個更好的方法,只能在一個地方定義監聽器的行爲。
我不喜歡這樣的:
public class ItemViewHolder extends RecyclerView.ViewHolder {
public CardView cardView;
public TextView itemText;
public ImageView itemFirstButton;
public ImageView itemSecondButton;
public ItemViewHolder(View itemView) {
super(itemView);
cardView = (CardView)itemView.findViewById(R.id.item_card_view);
itemText = (TextView)itemView.findViewById(R.id.item_text);
itemFirstButton = (ImageView)itemView.findViewById(R.id.ic_first_action);
itemSecondButton = (ImageView)itemView.findViewById(R.id.ic_second_action);
itemFirstButton.setOnClickListener(firstListener);
itemSecondButton.setOnClickListener(secondListener);
}
private View.OnClickListener firstLinstener = new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = getAdapterPosition();
}
};
private View.OnClickListener secondListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = getAdapterPosition();
}
};
}
聽衆,我不能得到關於該項目,只是位置的任何引用裏面...
我的印象中我要申報一個監聽器的接口並傳遞給適配器,但我不知道如何。
在視圖中聲明偵聽器還是將它們保存在適配器中作爲舊解決方案還有意義嗎?
Nop。當您需要適配器的某些東西時,將偵聽器放入ViewHolder中對我來說沒有任何意義。由於視圖在滾動過程中不斷被破壞並重新創建,因此您需要在onBind中定義它。如果你的監聽器做了一些通用的事情,而不依賴於任何適配器數據,那麼把它放在viewHolder中是有意義的。 – Panther
嗨Panther,我的聽衆做一些依賴於項目的東西(例如點擊一個按鈕我想分享項目數據)。對於使用相同ViewHolder的2個不同適配器,共享操作具有相同的行爲。所以,如果我很好理解你建議將聽衆保持在適配器內...... – DavideN
是的,我建議你將聽者保持在適配器內。但是,由於您提到的行動是相同的,我相信您正在嘗試達成DRY解決方案。我會在你的情況下做的是寫一個共同的功能來執行所有的股份。監聽者只是一個代理人,他將使用適當的數據調用共享操作。 – Panther