1

1でクリックした項目にアクセスすることはできません)問題ViewHolder内部のonClickアダプタ

私はCardView内部の2つのボタンに2人のリスナーを設定したいと思います。どの項目が選択されたのか知る必要があります。

@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 
    } 

} 

この:私はこのような私のFirebaseRecyclerAdapterの)私は(populateViewHolderでリスナーを作成しているRecyclerViewとFirebaseRecyclerAdapterとCardView(RecyclerView.Adapter)

2)旧状況

を使用します正常に動作します!

3)私は自分のファイルに定義されてViewHolderクラスの

セットリスナーを()を行うと、選択した項目

に何かをしたいと思います私は何を設定したいと思いますViewHolderクラスのリスナーは異なるアダプタで同じViewHolderが使用されるため、リスナーの動作を1つの場所で定義する方が良い方法だと思います。

私はこのようでした:私は、アイテム上の任意の参照を取得することはできませんリスナー、ちょうど位置インサイド

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。アダプタから何かが必要なときにListHolderの内部にリスナーを置くことは意味がありません。ビューは常にスクロール中に破棄され、再作成されるため、onBindの間にビューを定義する必要があります。リスナーが汎用的で何らかのアダプタデータに依存しないものを実行する場合、それをviewHolderの中に入れるのは意味があります。 – Panther

+0

こんにちはパンサー、私のリスナーは、アイテムに依存する何かをします(アイテムデータを共有したいボタンをクリックする例)。共有アクションは、同じViewHolderを使用する2つの異なるアダプタで同じ動作をします。ですから、私がよく理解していれば、リスナーをアダプタの中に入れておくことをお勧めします... – DavideN

+0

はい、リスナをアダプタ内に保つことをお勧めします。しかし、あなたは行動が同じであると言及しているので、私はあなたがドライソリューションに到着しようとしていると信じています。私があなたの場合に行うことは、すべての株式を実行する共通の機能を書くことです。リスナーは、適切なデータで共有アクションを呼び出す代理人に過ぎません。 – Panther

答えて

0

あなたの位置をアダプターに伝えたい場合は、ViewHolderコンストラクターを介していくつかのインターフェースを渡すだけです。 または 以前の方法です。

ポイントは、誰にポジションを委任するかです。

0

はい、インターフェイスを使用することをお勧めします。次に、あなたの活動にそのメソッドを実装

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

のように続いてsetOnClicklistner

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

ようなインターフェイスを作成します。これからあなたはポジションを獲得します。次に、positionを使って配列から要素を取得します。

+0

こんにちは、答えをありがとう...申し訳ありませんが、私にはそれを行う方法が本当に明確ではありません。アダプターにリスナーを設定する必要はありますか? 選択したアイテムデータを共有する共有アクションを実装できるViewHolderでリスナーを定義したいとします(onClickビヘイビアをViewHolderで定義する必要があります)。どのようにアイテムをアダプタからViewHolderに渡すことができますか? – DavideN

関連する問題