teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2021/05/26 16:16

投稿

hoshi-takanori
hoshi-takanori

スコア7903

answer CHANGED
@@ -65,4 +65,48 @@
65
65
  }
66
66
  }
67
67
  }
68
+ ```
69
+
70
+ 最後まで行ったら最初に戻るようにするには、次のように変更すると良いでしょう。
71
+
72
+ ```diff
73
+ public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.CustomViewHolder> {
74
+ private RecyclerView recyclerView;
75
+ + private LinearLayoutManager layoutManager;
76
+ private List<Item> items;
77
+ + private int focusPosition = -1;
78
+
79
+ - public CustomAdapter(RecyclerView recyclerView, List<Item> items) {
80
+ + public CustomAdapter(RecyclerView recyclerView, LinearLayoutManager layoutManager, List<Item> items) {
81
+ this.recyclerView = recyclerView;
82
+ + this.layoutManager = layoutManager;
83
+ this.items = items;
84
+ +
85
+ + recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
86
+ + @Override
87
+ + public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
88
+ + if (newState == RecyclerView.SCROLL_STATE_IDLE && focusPosition >= 0) {
89
+ + setFocus(focusPosition);
90
+ + focusPosition = -1;
91
+ + }
92
+ + }
93
+ + });
94
+ }
95
+
96
+ // 略
97
+
98
+ public void focusNext() {
99
+ int position = getAdapterPosition() + 1;
100
+ - if (position < items.size()) {
101
+ + if (position == items.size()) {
102
+ + position = 0;
103
+ + }
104
+ + if (position >= layoutManager.findFirstCompletelyVisibleItemPosition() &&
105
+ + position <= layoutManager.findLastCompletelyVisibleItemPosition()) {
106
+ setFocus(position);
107
+ + } else {
108
+ + focusPosition = position;
109
+ + recyclerView.smoothScrollToPosition(position);
110
+ }
111
+ }
68
112
  ```