1010import android .view .View ;
1111import android .widget .LinearLayout ;
1212
13+ import androidx .annotation .NonNull ;
1314import androidx .annotation .Nullable ;
1415import androidx .annotation .RequiresApi ;
1516import androidx .recyclerview .widget .GridLayoutManager ;
2122import com .zaaach .transformerslayout .listener .OnTransformersScrollListener ;
2223import com .zaaach .transformerslayout .view .RecyclerViewScrollBar ;
2324
25+ import java .util .ArrayList ;
2426import java .util .List ;
2527
2628/**
@@ -51,16 +53,17 @@ public class TransformersLayout<T> extends LinearLayout {
5153 private int scrollBarTopMargin ;
5254 private int scrollBarWidth ;
5355 private int scrollBarHeight ;
56+ private boolean pagingMode ;
5457 private OnTransformersItemClickListener onTransformersItemClickListener ;
5558
5659 private RecyclerView recyclerView ;
5760 private RecyclerViewScrollBar scrollBar ;
5861 private OnTransformersScrollListener onScrollListener ;
5962
63+ private List <T > mDataList ;
6064 private TransformersAdapter <T > transformersAdapter ;
6165 private GridLayoutManager layoutManager ;
6266 private Parcelable savedState ;//保存的滚动状态
63- // private boolean attached;
6467
6568 public TransformersLayout (Context context ) {
6669 this (context , null );
@@ -121,7 +124,13 @@ private void init(final Context context) {
121124 itemAnimator .setChangeDuration (0 );
122125 }
123126
124- setupRecyclerView ();
127+ layoutManager = new GridLayoutManager (getContext (), lines , GridLayoutManager .HORIZONTAL , false ){
128+ @ Override
129+ public boolean canScrollVertically () {
130+ return false ;
131+ }
132+ };
133+ recyclerView .setLayoutManager (layoutManager );
125134 transformersAdapter = new TransformersAdapter <>(context , recyclerView );
126135 recyclerView .setAdapter (transformersAdapter );
127136
@@ -132,16 +141,6 @@ private void init(final Context context) {
132141 addView (scrollBar );
133142 }
134143
135- private void setupRecyclerView () {
136- layoutManager = new GridLayoutManager (getContext (), lines , GridLayoutManager .HORIZONTAL , false ){
137- @ Override
138- public boolean canScrollVertically () {
139- return false ;
140- }
141- };
142- recyclerView .setLayoutManager (layoutManager );
143- }
144-
145144 private void setupScrollBar () {
146145 LinearLayout .LayoutParams params = new LinearLayout .LayoutParams (scrollBarWidth , scrollBarHeight );
147146 params .topMargin = scrollBarTopMargin ;
@@ -157,17 +156,92 @@ public TransformersLayout<T> addOnTransformersItemClickListener(OnTransformersIt
157156 return this ;
158157 }
159158
160- public void load (List <T > data , TransformersHolderCreator <T > creator ){
159+ public void load (@ NonNull List <T > data , TransformersHolderCreator <T > creator ){
160+ if (pagingMode ){
161+ rearrange (data );
162+ }else {
163+ fillData (data );
164+ }
161165 transformersAdapter .setOnTransformersItemClickListener (onTransformersItemClickListener );
162166 transformersAdapter .setHolderCreator (creator );
163167 transformersAdapter .setSpanCount (spanCount );
164- transformersAdapter .setData (data );
168+ transformersAdapter .setData (mDataList );
165169 toggleScrollBar (data );
166170 if (scrollBar .getVisibility () == VISIBLE ) {
167171 scrollBar .attachRecyclerView (recyclerView );
168172 }
169173 }
170174
175+ /**
176+ * 重新排列数据,使数据转换成分页模式
177+ * 原始数据:
178+ * 1 3 5 7 9 11 13 15
179+ * 2 4 6 8 10 12 14 16
180+ * ==============================
181+ * 转换之后:(数据会增加null值)
182+ * 1 2 3 4 5 11 12 13 14 15
183+ * 6 7 8 9 10 16 null...
184+ */
185+ private void rearrange (List <T > data ) {
186+ if (data == null || data .isEmpty ()) return ;
187+ List <List <T >> splitList = new ArrayList <>();
188+ int size = data .size ();
189+ int toIndex = spanCount ;
190+ for (int i = 0 ; i < size ; i += spanCount ) {
191+ if (i + spanCount > size ){
192+ toIndex = size - i ;
193+ }
194+ List <T > split = data .subList (i , i + toIndex );
195+ splitList .add (split );
196+ }
197+
198+ List <List <T >> rowList = new ArrayList <>();
199+ for (int i = 0 ; i < lines ; i ++) {
200+ List <T > row = new ArrayList <>();
201+ for (int j = i ; j < splitList .size (); j += lines ) {
202+ row .addAll (splitList .get (j ));
203+ }
204+ rowList .add (row );
205+ }
206+
207+ List <T > result = new ArrayList <>();
208+ for (int i = 0 ; i < rowList .get (0 ).size (); i ++) {
209+ result .add (rowList .get (0 ).get (i ));
210+ for (int j = 0 ; j < rowList .size () - 1 ; j ++) {
211+ if (i > rowList .get (j +1 ).size () - 1 ){
212+ result .add (null );
213+ }else {
214+ result .add (rowList .get (j +1 ).get (i ));
215+ }
216+ }
217+ }
218+
219+ mDataList = result ;
220+ }
221+
222+ /**
223+ * 默认排序时如果数据大于一页,使用空数据填满最后一列,用于修复滚动条滑动时变长变短的问题
224+ * @param data
225+ */
226+ private void fillData (@ NonNull List <T > data ) {
227+ mDataList = data ;
228+ if (mDataList .isEmpty ()) return ;
229+ if (mDataList .size () > lines * spanCount && mDataList .size () % lines > 0 ){
230+ int left = lines - mDataList .size () % lines ;
231+ for (int i = 0 ; i < left ; i ++) {
232+ mDataList .add (null );
233+ }
234+ }
235+ }
236+
237+ /**
238+ * 获取列表数据
239+ * @return
240+ */
241+ public List <T > getDataList (){
242+ return mDataList ;
243+ }
244+
171245 public TransformersLayout <T > apply (@ Nullable TransformersOptions options ){
172246 if (options != null ){
173247 spanCount = options .spanCount <= 0 ? spanCount : options .spanCount ;
@@ -176,6 +250,7 @@ public TransformersLayout<T> apply(@Nullable TransformersOptions options){
176250 scrollBarHeight = options .scrollBarHeight <= 0 ? scrollBarHeight : options .scrollBarHeight ;
177251 scrollBarRadius = options .scrollBarRadius < 0 ? scrollBarHeight /2f : options .scrollBarRadius ;
178252 scrollBarTopMargin = options .scrollBarTopMargin <= 0 ? scrollBarTopMargin : options .scrollBarTopMargin ;
253+ pagingMode = options .pagingMode ;
179254
180255// Log.e(TAG, "trackColor = " + options.scrollBarTrackColor);
181256// Log.e(TAG, "thumbColor = " + options.scrollBarThumbColor);
@@ -196,9 +271,7 @@ public TransformersLayout<T> apply(@Nullable TransformersOptions options){
196271 */
197272 @ Override
198273 protected void onAttachedToWindow () {
199- // Log.e(TAG, "----------onAttachedToWindow()");
200274 super .onAttachedToWindow ();
201- // attached = true;
202275 if (savedState != null ) {
203276 layoutManager .onRestoreInstanceState (savedState );
204277 }
@@ -210,15 +283,18 @@ protected void onAttachedToWindow() {
210283 */
211284 @ Override
212285 protected void onDetachedFromWindow () {
213- // Log.e(TAG, "----------onDetachedFromWindow()");
214286 super .onDetachedFromWindow ();
215- // attached = false;
216287 savedState = layoutManager .onSaveInstanceState ();
217288 }
218289
219290 public void notifyDataChanged (List <T > data ){
220291 if (transformersAdapter != null ){
221- transformersAdapter .setData (data );
292+ if (pagingMode ){
293+ rearrange (data );
294+ }else {
295+ fillData (data );
296+ }
297+ transformersAdapter .setData (mDataList );
222298 scrollToStart ();
223299 }
224300 toggleScrollBar (data );
@@ -236,7 +312,6 @@ public void scrollToStart(boolean smooth){
236312 scrollBar .setScrollBySelf (true );
237313 if (recyclerView != null ) {
238314 if (recyclerView .computeHorizontalScrollOffset () > 0 ) {
239- // Log.e(TAG, "----------scrollToStart()");
240315 if (smooth ) {
241316 recyclerView .smoothScrollToPosition (0 );
242317 } else {
0 commit comments