2016年11月4日金曜日

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

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

ではどうしているかというと、View がタップされたときに呼び出すメソッドを Adapter 内に定義しておき、Activity や Fragment で Adapter を生成するときにそのメソッドを Override してタップされたときの処理を記述するようにしています。 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view); final VersionAdapter adapter = new VersionAdapter() { @Override protected void onVersionClicked(@NonNull String version) { super.onVersionClicked(version); // Activity 側でタップされたときの処理を行う Toast.makeText(MainActivity.this, version, Toast.LENGTH_SHORT).show(); } }; recyclerView.setAdapter(adapter); } public static class VersionAdapter extends RecyclerView.Adapter<VersionViewHolder> { // タップされたときに呼び出されるメソッドを定義 protected void onVersionClicked(@NonNull String version) { } private final List<String> versions = new ArrayList<>(); @Override public VersionViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { final LayoutInflater inflater = LayoutInflater.from(parent.getContext()); final VersionViewHolder holder = VersionViewHolder.create(inflater, parent); // onCreateViewHolder でリスナーをセット holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final int position = holder.getAdapterPosition(); final String version = versions.get(position); onVersionClicked(version); } }); return holder; } ... } } 完全なサンプルは
https://github.com/yanzm/RecyclerViewSample
にあります。


0 件のコメント:

コメントを投稿