RecyclerView.AdapterのonBindViewHolder内にOnClickListenerを追加することは、なぜ悪い習慣と考えられているのでしょうか?
質問
私は以下のコードを
RecyclerView.Adapter
クラスで、それはうまく動作します。
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.Viewholder> {
private List<Information> items;
private int itemLayout;
public MyAdapter(List<Information> items, int itemLayout){
this.items = items;
this.itemLayout = itemLayout;
}
@Override
public Viewholder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(itemLayout, parent, false);
return new Viewholder(v);
}
@Override
public void onBindViewHolder(Viewholder holder, final int position) {
Information item = items.get(position);
holder.textView1.setText(item.Title);
holder.textView2.setText(item.Date);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(view.getContext(), "Recycle Click" + position, Toast.LENGTH_SHORT).show();
}
});
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
Toast.makeText(v.getContext(), "Recycle Click" + position, Toast.LENGTH_SHORT).show();
return true;
}
});
}
@Override
public int getItemCount() {
return items.size();
}
public class Viewholder extends RecyclerView.ViewHolder {
public TextView textView1;
public TextView textView2;
public Viewholder(View itemView) {
super(itemView);
textView1=(TextView) itemView.findViewById(R.id.text1);
textView2 = (TextView) itemView.findViewById(R.id.date_row);
}
}
}
しかし、OnClickListenerを実装するのはバッドプラクティスであると私は考えています。
onBindViewHolder
メソッドに実装するのは良くないと思います。なぜこれがバッドプラクティスなのか、また、より良い代替案は何でしょうか?
どのように解決するのですか?
ViewHolderの内部でクリックロジックを処理した方が良い理由は、より明示的なクリックリスナーを使用できるためです。コモンズウェアの本で表現されている通りです。
ListView の行にある RatingBar のようなクリック可能なウィジェットは、行自体のクリックイベントと長い間衝突していました。クリックできる行を取得し、行の内容もクリックできるようにすることは、時に少し厄介です。RecyclerViewでは、この種のものがどのように処理されるかをより明確に制御することができます... なぜなら、クリック処理ロジックのすべてを設定するのはあなた自身だからです。
ViewHolderモデルを使用することで、RecyclerViewでのクリック処理のために、以前のListViewよりも多くの利点を得ることができます。これについては、違いを比較したブログ記事で書きました。 https://androidessence.com/recyclerview-vs-listview
なぜ、ViewHolderの中ではなく
onBindViewHolder()
の中ではなく、ビューホルダーの中が良い理由については、それは
onBindViewHolder()
が各項目ごとに呼び出されるためで、クリックリスナーを設定することは、ViewHolder コンストラクタで一度呼び出すことができれば、繰り返す必要がないオプションです。次に、クリックの応答がクリックされた項目の位置に依存する場合、単に
getAdapterPosition()
を ViewHolder 内から呼び出すだけです。
ここで
をどのように使うかを示す別の回答です。
OnClickListener
をViewHolderクラス内から使用する方法を示しています。
関連
-
Javaクラスが "Error occurred during initialization of boot layer "というエラーで実行される。
-
java マイクロソフト払い戻し予期せぬサーバーからのファイルの終了
-
SocketException java.netの4つの例外解決策。
-
セミコロン期待値エラー解決
-
ジャバアレイ
-
CertificateException: XXXに一致するサブジェクトの代替DNS名が見つかりません 解決策
-
代入の左辺は変数でなければならない 解答
-
春ブート複数のデータソースの管理(atomikos)同じサーバーホスト上の複数のプロジェクトを開始する複数のJava - jarのエラーソリューション
-
Java の double データ型における 0.0 と -0.0 の問題
-
[解決済み] 静的変数が悪とされるのはなぜですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Eclipse問題 アクセス制限。タイプ 'SunJCE' が API でないことを解決し、/jdk ディレクトリにある /jre と jre の違いについて理解を深める。
-
java.sql.SQLException: executeQuery()でデータ操作文を発行できません。
-
型に解決できない エラー解決
-
java -jarコマンドでパッケージを実行すると、無効または破損したjarfile xxxx.jarが表示される。
-
List list = new ArrayList(); Error: ArrayList は型に解決できません。
-
Javaがリソースリークに遭遇した:'input'が閉じない 解決方法
-
春ブート複数のデータソースの管理(atomikos)同じサーバーホスト上の複数のプロジェクトを開始する複数のJava - jarのエラーソリューション
-
Spring Bootは、Tomcatの組み込みのmaxPostSizeの値を設定します。
-
アクセス制限の解決方法: ---- in Java
-
switch case文のcaseの後の列挙定数は列挙型なし