私のViewHolder
はthis answerに示唆されているようにView.OnClickListener
を実装しています。それ以外は私のアダプタークラスは公式文書の例に似ていることを二重にチェックしました。RecyclerView.ViewHolderのonClickメソッドが呼び出されないのはなぜですか?
public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private View view;
public ViewHolder(View view) {
super(view);
view.setOnClickListener(this);
this.view = view;
}
public View getView() {
return view;
}
@Override
public void onClick(View view) {
Context context = view.getContext();
Intent intent = new Intent(context, DetailsActivity.class);
context.startActivity(intent);
}
}
しかし、私は、私はこれは本当に奇妙な振る舞いを観察私のアプリをテストしていた場合:私は、起動時に表示されている行をタップしていた場合は、予想通り、onClick
メソッドが実行されます。今度は、他の行を見えるようにスクロールします。どこかでタップしても何も起こらず、2番目のタップ(同じ行にあるかどうか)が再び動作します。上にスクロールすると同じことが起こり、onClick
というメソッドを呼び出すために2回タップする必要があります。
これは何が起こっているのですか?
EDIT:完全なコード、今onBindViewHolder
でリスナーを設定:
public class ComposersAdapter extends RecyclerView.Adapter<ComposersAdapter.ViewHolder> {
public static class ViewHolder extends RecyclerView.ViewHolder {
private View view;
public ViewHolder(View view) {
super(view);
this.view = view;
}
public View getView() {
return view;
}
}
private final String EXTRA_COMPOSER_ID = "composerId";
private List<Composer> composers;
public ComposersAdapter(List<Composer> composers) {
this.composers = composers;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.text_layout, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
View view = holder.getView();
TextView textView = view.findViewById(R.id.textView);
textView.setText(composers.get(position).getTitle());
holder.getView().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Context context = view.getContext();
Intent intent = new Intent(context, ComposerActivity.class);
intent.putExtra(EXTRA_COMPOSER_ID, holder.getAdapterPosition());
context.startActivity(intent);
}
});
}
@Override
public int getItemCount() {
return composers.size();
}
}
UPDATE:問題がRecyclerViewが常駐活動のツールバーに接続しているようで、私はapp:layout_scrollFlags="scroll|enterAlways"
を設定しています。それを取り除くと、問題はもう存在しません。たぶんこれはタッチイベントをキャプチャするツールバーと関係がありますか?私は自分自身を調べるのに十分な経験はありません。
なぜそれはonBindViewHolderで行われていませんか?ここでクリックリスナーを使用するのではなく、バインド方法のルートビューにあるものを試してみてください。 – Kushan
あなたは正しいです、それはよりクリーンです。しかし、問題はそのままです。 –
申し訳ありません私は九州のコメントを見ました。 @エライアス、アダプタの完全なコードを提供してください、私はあなたが保持している/ビューの参照を間違って割り当てていると思う。 – rgv