2016-10-10 51 views
2

ViewHolder(內)類:單OnClickListener多個ViewHolders

static class HostViewHolder extends RecyclerView.ViewHolder { 

    ImageButton button1; 
    ImageButton button2; 

    HostViewHolder(View listItemView) { 
     super(listItemView); 

     button1 = (ImageButton) listItemView.findViewById(R.id.button1); 
     button2 = (ImageButton) listItemView.findViewById(R.id.button2); 
    } 
} 

onBindViewHolder()附上OnClickListener年代到Button S上的方式如下:

@Override 
public void onBindViewHolder(final HostViewHolder holder, int position) { 
    holder.button1.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      int pos = holder.getAdapterPosition(); 
      // doing something using the value of pos 
     } 
    }); 
    holder.button2.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      int pos = holder.getAdapterPosition(); 
      // doing some other thing using the value of pos 
     } 
    }); 
} 

它的正常工作,但我的問題採用這種方法,我正在爲每個ViewHolder創建一個新的OnClickListener實例,這感覺有點多餘。

我想創建一個OnClickListener情況下使用,但我不能訪問的onBindViewHolder()positionholder PARAMS的方式。

這可能實現嗎?如果是這樣,怎麼樣?

在此先感謝。

+0

你的意思是你想爲Button1和Button2的一個監聽器? –

回答

1

您可以在ViewHolder類中附加onClickListener。

static class HostViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 

    ImageButton button1; 
    ImageButton button2; 

    HostViewHolder(View listItemView) { 
     super(listItemView); 

     button1 = (ImageButton) listItemView.findViewById(R.id.button1); 
     button2 = (ImageButton) listItemView.findViewById(R.id.button2); 
     button1.setOnClickListener(this); 
     button2.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     int position = getAdapterPosition(); 
     switch (v.getId()){ 
      //handle clicks 
     } 
    } 
} 
0

是其可能的,你可以實現它,因爲@Gurupad建議,在onClick(View v)方法使用switch語句。從個人經驗來看,它是處理多個onClicks的最佳方式,它使您的代碼易於閱讀和理解(如果與團隊一起工作)。

對於使用帶有按鈕開關語句進一步幫助單擊

public void onClick(View v) { 
    switch (v.getId()){ 
    case R.id.button1: 
    //some code here 
    break; 
    case R.id.button2: 
    //some code here 
    break; 
    } 
}