1

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

聽衆,我不能得到關於該項目,只是位置的任何引用裏面...

我的印象中我要申報一個監聽器的接口並傳遞給適配器,但我不知道如何。

在視圖中聲明偵聽器還是將它們保存在適配器中作爲舊解決方案還有意義嗎?

+0

Nop。當您需要適配器的某些東西時,將偵聽器放入ViewHolder中對我來說沒有任何意義。由於視圖在滾動過程中不斷被破壞並重新創建,因此您需要在onBind中定義它。如果你的監聽器做了一些通用的事情,而不依賴於任何適配器數據,那麼把它放在viewHolder中是有意義的。 – Panther

+0

嗨Panther,我的聽衆做一些依賴於項目的東西(例如點擊一個按鈕我想分享項目數據)。對於使用相同ViewHolder的2個不同適配器,共享操作具有相同的行爲。所以,如果我很好理解你建議將聽衆保持在適配器內...... – DavideN

+0

是的,我建議你將聽者保持在適配器內。但是,由於您提到的行動是相同的,我相信您正在嘗試達成DRY解決方案。我會在你的情況下做的是寫一個共同的功能來執行所有的股份。監聽者只是一個代理人,他將使用適當的數據調用共享操作。 – Panther

回答

0

如果你想告訴你的位置適配器,只需通過ViewHolder構造函數傳遞一些接口。 或 以前的方式。

重點是你想要將這個職位委託給誰。

0

是的,這是使用界面的好習慣。創建像

public interface OnClick { 
    void getItem(int item); 
} 

然後接口setOnClicklistner像

itemViewHolder. itemText.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       OnClick onClick = (OnClick)context; 
       onClick.getItem(position); 
      } 
     }); 

然後在你的活動實施該方法。從這裏你得到的位置。然後通過使用位置從數組中獲取元素。

+0

嗨,謝謝你的回答...對不起,但我不清楚如何去做。我是否必須在適配器上設置偵聽器? 假設我想在ViewHolder中定義一個可以實現共享操作以共享所選項目數據的監聽器(因此onClick行爲應該在ViewHolder中定義)。我怎樣才能將項目從適配器傳遞給ViewHolder? – DavideN

相關問題