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();
}
};
}
...
私は宣言する必要が印象を持っていますリスナーのためのインターフェイスとアダプタに渡すが、私はどのようにわからない。
リスナーをビューホルダーに宣言するのはまだ理にかなっていますか、それとも古いソリューションとしてアダプターに保持していますか?
Nop。アダプタから何かが必要なときにListHolderの内部にリスナーを置くことは意味がありません。ビューは常にスクロール中に破棄され、再作成されるため、onBindの間にビューを定義する必要があります。リスナーが汎用的で何らかのアダプタデータに依存しないものを実行する場合、それをviewHolderの中に入れるのは意味があります。 – Panther
こんにちはパンサー、私のリスナーは、アイテムに依存する何かをします(アイテムデータを共有したいボタンをクリックする例)。共有アクションは、同じViewHolderを使用する2つの異なるアダプタで同じ動作をします。ですから、私がよく理解していれば、リスナーをアダプタの中に入れておくことをお勧めします... – DavideN
はい、リスナをアダプタ内に保つことをお勧めします。しかし、あなたは行動が同じであると言及しているので、私はあなたがドライソリューションに到着しようとしていると信じています。私があなたの場合に行うことは、すべての株式を実行する共通の機能を書くことです。リスナーは、適切なデータで共有アクションを呼び出す代理人に過ぎません。 – Panther