2016年11月4日金曜日

RecyclerView のクリックをどこで処理するか

RecyclerView.Adapter の責務はデータと ViewHolder の紐付けなので、View がタップされたときの処理(リスナーをセットすることではない)を Adapter 内に書くべきではないと思っています。

ではどうしているかというと、View がタップされたときに呼び出すメソッドを Adapter 内に定義しておき、Activity や Fragment で Adapter を生成するときにそのメソッドを Override してタップされたときの処理を記述するようにしています。
  1. public class MainActivity extends AppCompatActivity {  
  2.   
  3.     @Override  
  4.     protected void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.activity_main);  
  7.   
  8.         final RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);  
  9.   
  10.         final VersionAdapter adapter = new VersionAdapter() {  
  11.             @Override  
  12.             protected void onVersionClicked(@NonNull String version) {  
  13.                 super.onVersionClicked(version);  
  14.                 // Activity 側でタップされたときの処理を行う  
  15.                 Toast.makeText(MainActivity.this, version, Toast.LENGTH_SHORT).show();  
  16.             }  
  17.         };  
  18.   
  19.         recyclerView.setAdapter(adapter);  
  20.     }  
  21.   
  22.     public static class VersionAdapter extends RecyclerView.Adapter<VersionViewHolder> {  
  23.   
  24.         // タップされたときに呼び出されるメソッドを定義  
  25.         protected void onVersionClicked(@NonNull String version) {  
  26.         }  
  27.   
  28.         private final List<String> versions = new ArrayList<>();  
  29.   
  30.         @Override  
  31.         public VersionViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {  
  32.             final LayoutInflater inflater = LayoutInflater.from(parent.getContext());  
  33.             final VersionViewHolder holder = VersionViewHolder.create(inflater, parent);  
  34.             // onCreateViewHolder でリスナーをセット  
  35.             holder.itemView.setOnClickListener(new View.OnClickListener() {  
  36.                 @Override  
  37.                 public void onClick(View v) {  
  38.                     final int position = holder.getAdapterPosition();  
  39.                     final String version = versions.get(position);  
  40.                     onVersionClicked(version);  
  41.                 }  
  42.             });  
  43.             return holder;  
  44.         }  
  45.   
  46.         ...  
  47.     }  
  48. }  
完全なサンプルは
https://github.com/yanzm/RecyclerViewSample
にあります。


0 件のコメント:

コメントを投稿