@@ -39,7 +39,7 @@ public class TransformersLayout<T> extends LinearLayout {
3939 /** 默认每页2行 */
4040 private static final int DEFAULT_LINES = 2 ;
4141 /** 滚动条默认宽度 */
42- private static final int DEFAULT_SCROLL_BAR_WIDTH = 36 ;//dp
42+ private static final int DEFAULT_SCROLL_BAR_WIDTH = 48 ;//dp
4343 /** 滚动条默认高度 */
4444 private static final int DEFAULT_SCROLL_BAR_HEIGHT = 3 ;//dp
4545 private static final int DEFAULT_TRACK_COLOR = Color .parseColor ("#f0f0f0" );
@@ -64,6 +64,7 @@ public class TransformersLayout<T> extends LinearLayout {
6464 private TransformersAdapter <T > transformersAdapter ;
6565 private GridLayoutManager layoutManager ;
6666 private Parcelable savedState ;//保存的滚动状态
67+ private TransformersOptions transformersOptions ;
6768
6869 public TransformersLayout (Context context ) {
6970 this (context , null );
@@ -90,6 +91,7 @@ private void parseAttrs(Context context, AttributeSet attrs) {
9091 TypedArray array = context .obtainStyledAttributes (attrs , R .styleable .TransformersLayout );
9192 spanCount = array .getInteger (R .styleable .TransformersLayout_tl_spanCount , DEFAULT_SPAN_COUNT );
9293 lines = array .getInteger (R .styleable .TransformersLayout_tl_lines , DEFAULT_LINES );
94+ pagingMode = array .getBoolean (R .styleable .TransformersLayout_tl_pagingMode , false );
9395 scrollBarRadius = array .getDimensionPixelSize (R .styleable .TransformersLayout_tl_scrollbarRadius , -1 );
9496 scrollBarTrackColor = array .getColor (R .styleable .TransformersLayout_tl_scrollbarTrackColor , DEFAULT_TRACK_COLOR );
9597 scrollBarThumbColor = array .getColor (R .styleable .TransformersLayout_tl_scrollbarThumbColor , DEFAULT_THUMB_COLOR );
@@ -157,11 +159,7 @@ public TransformersLayout<T> addOnTransformersItemClickListener(OnTransformersIt
157159 }
158160
159161 public void load (@ NonNull List <T > data , TransformersHolderCreator <T > creator ){
160- if (pagingMode ){
161- rearrange (data );
162- }else {
163- fillData (data );
164- }
162+ fixData (data );
165163 transformersAdapter .setOnTransformersItemClickListener (onTransformersItemClickListener );
166164 transformersAdapter .setHolderCreator (creator );
167165 transformersAdapter .setSpanCount (spanCount );
@@ -182,9 +180,41 @@ public void load(@NonNull List<T> data, TransformersHolderCreator<T> creator){
182180 * 1 2 3 4 5 11 12 13 14 15
183181 * 6 7 8 9 10 16 null...
184182 */
185- private void rearrange (List <T > data ) {
186- if (data == null || data .isEmpty ()) return ;
187- List <List <T >> splitList = new ArrayList <>();
183+ private List <T > rearrange (List <T > data ) {
184+ if (lines <= 1 ) return data ;
185+ if (data == null || data .isEmpty ()) return data ;
186+ List <T > destList = new ArrayList <>();
187+ int pageSize = lines * spanCount ;
188+ int size = data .size ();
189+ //转换后的总数量,包括空数据
190+ int sizeAfterTransform ;
191+ if (size < pageSize ) {
192+ // sizeAfterTransform = pageSize;
193+ sizeAfterTransform = size < spanCount ? size * lines : pageSize ;
194+ } else if (size % pageSize == 0 ) {
195+ sizeAfterTransform = size ;
196+ } else {
197+ // sizeAfterTransform = (size / pageSize + 1) * pageSize;
198+ sizeAfterTransform = size % pageSize < spanCount
199+ ? (size / pageSize ) * pageSize + size % pageSize * lines
200+ : (size / pageSize + 1 ) * pageSize ;
201+ }
202+ //类似置换矩阵
203+ for (int i = 0 ; i < sizeAfterTransform ; i ++) {
204+ int pageIndex = i / pageSize ;
205+ int columnIndex = (i - pageSize * pageIndex ) / lines ;
206+ int rowIndex = (i - pageSize * pageIndex ) % lines ;
207+ int destIndex = (rowIndex * spanCount + columnIndex ) + pageIndex * pageSize ;
208+
209+ if (destIndex >= 0 && destIndex < size ) {
210+ destList .add (data .get (destIndex ));
211+ } else {
212+ destList .add (null );
213+ }
214+ }
215+
216+ //自己瞎捣鼓的方法...和上面的一比惨不忍睹
217+ /*List<List<T>> splitList = new ArrayList<>();
188218 int size = data.size();
189219 int toIndex = spanCount;
190220 for (int i = 0; i < size; i += spanCount) {
@@ -204,28 +234,28 @@ private void rearrange(List<T> data) {
204234 rowList.add(row);
205235 }
206236
207- List <T > result = new ArrayList <>();
237+ List<T> destList = new ArrayList<>();
208238 for (int i = 0; i < rowList.get(0).size(); i++) {
209- result .add (rowList .get (0 ).get (i ));
239+ destList .add(rowList.get(0).get(i));
210240 for (int j = 0; j < rowList.size() - 1; j++) {
211241 if (i > rowList.get(j+1).size() - 1){
212- result .add (null );
242+ destList .add(null);
213243 }else {
214- result .add (rowList .get (j +1 ).get (i ));
244+ destList .add(rowList.get(j+1).get(i));
215245 }
216246 }
217- }
247+ }*/
218248
219- mDataList = result ;
249+ return destList ;
220250 }
221251
222252 /**
223253 * 默认排序时如果数据大于一页,使用空数据填满最后一列,用于修复滚动条滑动时变长变短的问题
224254 * @param data
225255 */
226256 private void fillData (@ NonNull List <T > data ) {
257+ if (lines <= 1 || data .isEmpty ()) return ;
227258 mDataList = data ;
228- if (mDataList .isEmpty ()) return ;
229259 if (mDataList .size () > lines * spanCount && mDataList .size () % lines > 0 ){
230260 int left = lines - mDataList .size () % lines ;
231261 for (int i = 0 ; i < left ; i ++) {
@@ -242,8 +272,13 @@ public List<T> getDataList(){
242272 return mDataList ;
243273 }
244274
275+ public TransformersOptions getOptions (){
276+ return transformersOptions ;
277+ }
278+
245279 public TransformersLayout <T > apply (@ Nullable TransformersOptions options ){
246280 if (options != null ){
281+ transformersOptions = options ;
247282 spanCount = options .spanCount <= 0 ? spanCount : options .spanCount ;
248283 int newLines = options .lines <= 0 ? lines : options .lines ;
249284 scrollBarWidth = options .scrollBarWidth <= 0 ? scrollBarWidth : options .scrollBarWidth ;
@@ -289,11 +324,7 @@ protected void onDetachedFromWindow() {
289324
290325 public void notifyDataChanged (List <T > data ){
291326 if (transformersAdapter != null ){
292- if (pagingMode ){
293- rearrange (data );
294- }else {
295- fillData (data );
296- }
327+ fixData (data );
297328 transformersAdapter .setData (mDataList );
298329 scrollToStart ();
299330 }
@@ -304,6 +335,14 @@ public void notifyDataChanged(List<T> data){
304335 }
305336 }
306337
338+ private void fixData (List <T > data ) {
339+ if (pagingMode ) {
340+ mDataList = rearrange (data );
341+ } else {
342+ fillData (data );
343+ }
344+ }
345+
307346 public void scrollToStart (){
308347 scrollToStart (true );
309348 }
0 commit comments